4

この方法で Ajax 呼び出しのスタックを作成したい: call(n) は call(n-1) が終了した後に開始されます...

多くの理由でasync:falseを使用できません。

  • 一部のリクエストはおそらくjsonp (最も関連性の高いもの)
  • 私はその間にうまくいくかもしれない他のajaxリクエストを持っています..
  • ブラウザがブロックされました

このようにリクエストを連鎖させることはできません:

$.post('server.php', {param:'param1'}, function(data){
        //process data
    $.post('server.php', {param:'param2'}, function(data){
        //process data
    });
});

リクエストの数とパラメーターは、ユーザー入力から動的に作成されるためです。

私の問題を示す小さな例。

サーバーの応答順序がランダムであることがわかります。私が達成したいのは、順序どおりにすることです

Response to arg1
Response to arg2
Response to arg3
Response to arg4
Response to arg5
Response to arg6

どんな助けでも大歓迎です、ありがとう。

4

2 に答える 2

7

わかりました、jQuery AjaxはDeferred Objectを返します。これはこれを達成するのに役立ちます。

方法は次のとおりです。

var args = ['arg1','arg2','arg3','arg4','arg5','arg6'];

deferredPost(0, 5);

function deferredPost(index, max){    
    var delay = Math.random()*3;
    if (index<max){
        return $.post('/echo/html/', {html:('Response to '+args[index]), delay:delay}, 
        function(data){
            $('#response').append(data+'<br>');
        }).then(function(){
            deferredPost(index+1, max);
        });
    } else {
        return $.post('/echo/html/', {html:('Response to '+args[index]), delay:delay}, 
        function(data){
            $('#response').append(data+'<br>');
        });
    }
}

デモ

ここではthen関数を使用しました。

また、遅延オブジェクトについてもう少し読むことをお勧めします。遅延オブジェクトはいくつかの一般的な問題を解決できます。

于 2012-06-11T13:33:30.903 に答える
1

これはキューのジョブです。

var queue = ['arg1','arg2','arg3','arg4','arg5','arg6'];

function runQueueInOrder() {
    if (queue.length === 0) { return; }
    var arg = queue.pop();
    var delay = Math.random()*3;
    $.post('/echo/html/', {html:('Response to '+ arg), delay:delay}, 
        function(data){
            $('#response').append(data+'<br>');        
    }).then(function() {
        runQueueInOrder();
    });        
}

runQueueInOrder();

thenキューの処理を関数にカプセル化した場合、これが機能するために jQuery を使用する必要はありません。便利だけど。このコードは、元の配列から要素を削除するため、破壊的です (ただし、要素が処理されるため、通常は問題ありません)。

このメソッドrunQueueInOrderは、処理を開始するために呼び出されます。

実行する作業がなくなると、関数は単純に終了します。(以前にタイマーをポーリングするバージョンを作成しましたが、ここでは必要ありません)。

関数は次の作業argを取得し、呼び出し構文を呼び出します。完了したら、postjQuery の deferred then callback を使用して関数を再度呼び出します (必要に応じてキューをさらに処理するため)。

(他の回答を見て、従うのがわかりにくいことがわかったので、より単純なアプローチを取りました。私の単純なバージョンを使用すると、新しい作業が発見されたときに新しいアイテムを追加したり、削除したりできます。)

于 2012-06-11T15:45:39.957 に答える