1

私のスクリプトはいくつかのajaxリクエストを処理する必要があります。簡略化したバージョンは次のとおりです。

function request(variable){
    $.ajax({
        // call config
    }).done(function(data){
        // treatment of returned data
        // returning TRUE (ok) or FALSE (errors)
    }).fail(function(e){
        // generating error message
    });
}

私はいくつかの電話をかける必要があります:

request(variableA);
request(variableB);
request(variableC);

リクエストは同時に実行され、うまく機能しますが、プロセスがいつ終了するかはわかりません。また、戻り値を表示できません。

いくつかの議論はwhen()を使用することを提案しています。

  $.when(request(variableA), request(variableB), request(variableC))
   .done(function(resultA, resultB, resultC) { 
         alert("Finished!");
         //results available
    });

このコードを使用すると、アラートは完了を待つのではなく、プロセスの最初に実行されるようです...

私の最善の選択肢は何でしょうか?

4

2 に答える 2

4

request約束を返すために変更します

function request(variable){
    return $.ajax({
        // call config
    }).done(function(data){
        // treatment of returned data
        // returning TRUE (ok) or FALSE (errors)
    }).fail(function(e){
        // generating error message
    });
}
于 2013-02-15T18:36:13.957 に答える
2

これらのrequest()呼び出しは、非同期であるため(したがって、AJAXのA)、とにかくすぐに返されます。リクエストを連鎖させ、すべてが完了したときにのみ何かを実行するには、個々のajax呼び出しの成功ハンドラーにカウンターをインクリメントさせ、カウンターが特定のポイントに達したときにのみ「goahead」コードを呼び出す必要があります。例えば

var alert_counter = 0;
function request('blahblah', alert_when_reached) {
$.ajax({
     success: function() { 
        alert_counter++;
        if(alert_when_reached >= alert_counter) {
           proceed_onwards();
        }
     });

これがそのまま機能するわけではありませんが、アイデアが得られるはずです。3つの並列要求を呼び出す必要がある場合は3、それらの各要求に渡し、3番目の結果が最終的に到着すると、成功ハンドラーのその特定のインスタンスが、コードを続行できる関数を呼び出します。

いくつかのマイナーな機能強化は、成功ハンドラーのクロージャーを定義し、それをrequest()関数に渡すことです。そのため、ハードコードされた「proceed」関数呼び出しはありませんが、これはこの回答の範囲を超えています。

于 2013-02-15T18:36:22.843 に答える