2012-03-01 10 views
0

サーバー側でコマンド文字列を実行し、その結果をクライアントに返す非同期Ajax関数があります。結果を処理するコールバックを呼び出します。非同期呼び出し後のタイマーの設定

function ajaxCall(commandStr,callback){ 
    var url=......//make a url with the command string 
    jquery.get(url,function(result){ 
     //process the result using callback 
     callback(result); 
    }); 
} 

非同期呼び出し(ajaxCall)が終了するまでに時間がかかるかもしれませんが、私はそれがインターバル(1000ミリ秒)後に同じコマンドを実行したいです。

私はこのような関数を書きたい:

function ajaxCallRepeated(interval,commandStr,callback) 

私はこのようなクロージャを試してみました:

function ajaxCallRepeated(interval,commandStr,callback){ 
    //This feature uses closures in Javascript. Please read this to know why and how: http://jibbering.com/faq/notes/closures/#clSto 
    function callLater(param1,param2,param3){ 
     return (function(){ 
      ajaxCall(param2,function(out,err){ 
       if(param3)param3(out,err); 
       var functRef = callLater(param1,param2,param3); 
       setTimeout(functRef, interval); 
      }); 
     }); 
    } 
    //the first call 
    var functRef = callLater(interval,commandStr,callback); 
    setTimeout(functRef, interval); 
} 

は、その後、私はこのようにそれを呼び出す:

ajaxCallRepeated(2000,"ls",function(result){ 
    alert(result); 
}); 

しかし、コマンドは2回だけ実行されます。 非同期関数のコールバックとして呼び出された後に自身を再スケジュールする関数を作成するにはどうすればよいですか?

PS。以前のAjaxコールが終了した後、別のAjaxコールを起動したい。また、axashCallRepeated()はさまざまなパラメータで呼び出されるので、いくつかのAjax呼び出しが並行して実行されますが、各CommandStrではAjax呼び出しが1回しか実行されず、Ajax呼び出しが返された後でもう1つX秒後に解雇される。

+0

私はこのストレートを取得してみましょう。以前のajax呼び出しがまだ完了していない可能性があるという事実に関係なく、X秒ごとに呼び出すようにコールバックで新しいajax呼び出しをスケジュールしたい場合や、順番にajax呼び出しを実行したい場合(前の呼び出し終了しましたか? – WTK

+0

前のAjaxコールが終了した後、別のAjaxコールを起動したい。また、axashCallRepeated()はさまざまなパラメータで呼び出されるので、いくつかのAjax呼び出しが並行して実行されますが、各CommandStrではAjax呼び出しが1回しか実行されず、Ajax呼び出しが返された後でもう1つX秒後に解雇される。 – AlexStack

+0

最初のAjax呼び出しが終了してから2番目のAjax呼び出しが実行されると、私はカスタムイベントを起動します。 –

答えて

1

setTimeoutを使用して2番目のAjax呼び出しをトリガーしません。どのくらいの時間がかかり、終了したかわからないからです!
限りあなたが右のあなたの質問をタグ付けし、あなたはjqueryのを使用しているとして、あなたはこのようなものを検討する必要があります。だから、これはAjaxのポストが行われ、成功したと、今あなたが二番目を実行することができていることを確認します

$.ajax({ 
    type: 'POST', 
    url: url, 
    data: data, 
    success: function(){ 
    // The AJAX is successfully done, now you trigger your custom event: 
    $(document).trigger('myAjaxHasCompleted'); 
    }, 
    dataType: dataType 
}); 

$(function(){ 
    //somehwere in your document ready block 
    $(document).on("myAjaxHasCompleted",function(){ 
     $.ajax({ 
      //execute the second one 
     }); 
    }); 
}); 

を。あなたの質問に対する正確な答えではなく、このようなものを使うことを検討すべきです!

function ajaxCallRepeated(interval,commandStr,callback){ 
    //This feature uses closures in Javascript. Please read this to know why and how: http://jibbering.com/faq/notes/closures/#clSto 
    function callLater(_interval,_commandString,_callback){ 
     var closure=(function(){ 
      ajaxCall(_commandString,function(out,err){ 
       if(_callback)_callback(out,err); 
       setTimeout(closure,_interval); 
      }); 
     }); 
     return closure; 
    } 
    //now make a closure for every call to this function 
    var functRef = callLater(interval,commandString,callback); 
    //the first call 
    functRef(); 
} 
+1

良いアイデアですが、ajax呼び出しが完了したコマンドを知るには、カスタムイベント(この例のコマンドなど)に追加データを渡す必要があります。 – WTK

+0

私は同意します!しかし、私の答えは、そうすることができる方法へのヒントとして考えなければならない、私は彼がこれを認識すると思う:-) –

+0

ええ、私は最近、カスタムイベントでこのように来た!私はまた、特定のプロジェクトでsetTimeoutを使用して、私のAjax呼び出しが確実に行われたことを確認しましたが、安全な方法もクリーンな解決策もないので、これを行うより良い方法があるので、実行すべきではありません: –

0

キーが閉鎖自体への参照を保存し、次の呼び出しをスケジュールするときにそれを使用することです:-)推測、それはより安全になるだろう物事をちょっと分かれば

例えば、繰り返しロジックはすべてのAJAXやコールバックについて知っている必要はありません。

function mkRepeater(interval, fn, fnScope, fnArgs) { 
    var running; 

    function repeat() { 
    if (!running) return; 
    fn.apply(fnScope, fnArgs); 
    setTimeout(repeat, interval); 
    } 

    return { 
    start: function() { running = true; repeat(); }, 
    stop: function() { running = false; } 
    }; 
} 

あなたはこのようにそれを使用することができます:

var r = mkRepeater(2000, ajaxFunction, this, ["getStuff", callbackFn]); 
r.start(); 
... 
r.stop(); 
+0

あなた自身の答えに満足している場合は、それを受け入れることを忘れないでください。そうすれば、あなたの質問は「答えられていない」と表示されません。ありがとう! – WTK

+0

私は試しましたが、質問をして2日後に自分の答えを受け入れることはできません。それはそれが上がるようにそれを投票するのに役立ち、人々はそこに良い答えがあることを見る。私は自分の答えを投票することはできません。 – AlexStack

0

それはおよそ理由に容易になる:私はこの問題を解決するための

+0

repeat()は、mkRepeater()が呼び出されるたびにinterval、fn、fnScope、fnArgsに同じ値を使用します。私はいくつかの呼び出しを並行して実行する必要があります。 – AlexStack

+0

複数の*コールを呼び出す必要がありますが、それらをずらす必要がありますか? – Deestan

関連する問題