3

ループ内に jQuery POST 関数があります (複数のポスト呼び出し)。
何らかの理由で、jQuery は投稿していますが、ループが終了するまですべてのデータを返さず、すべての結果を一度に解析します。

FOREACH arg_value IN args
{
console.log('Do stuff');

    $.post('https://blah.com/xml.php',
           {arg: arg_value},
           function(xml) {
                $(xml).find('tag').each(function() {
                        console.log('Do more stuff');
                });
           });
}

これの出力は...

何かをする
何かを する もっと
何か をする もっと多くのことを する もっと多くのことをする


jQueryが結果をキャッシュしているか、最後まで実行していないようです。

私は期待しています...

何かを
する もっと何かをする もっと
何かを
する もっと 何かをする もっと何かを
する

AJAXからの結果があるまで実行を一時停止するようにjQueryに指示するオプションはありますか? いつものように非同期で実行されているように見えますが、この場合はそうしたくありません。

4

4 に答える 4

3

AJAX呼び出しは非同期です。これはあなたのコールバックを意味します:

function(xml) {
    $(xml).find('tag').each(function() {
        console.log('Do more stuff');
    });
}

サーバーが応答を返したときにのみ実行されます。

その間、for-eachループは実行を続け、ログを記録しDo stuffます。
ループでクレイジーなことをしているのでない限り、ループはサーバーの応答よりも速くなりますJan Dvorak
が述べた ように、クレイジーなことをしたとしても、AJAXコールバックはループが終了するのを待ち、結果として常にAJAX応答。Do stuff

于 2012-11-30T13:58:41.263 に答える
1

$.post() は非同期呼び出しです...あなたが望むようにループで動作しません..あなたが望む方法を得るために..ここに解決策があります..

var i=0;
callbackfunc(i) {
console.log('Do stuff');
$.post('https://blah.com/xml.php',
        {arg: args[i]},
        function(xml) {
            $(xml).find('tag').each(function() {
              //something related to xml data  
            });
             console.log('Do more stuff');
              i++;
              if(i<args.length)callbackfunc(i)
           }
        });
}

変数に注意してください..ここでクロージャーを作成する可能性があります...

于 2012-11-30T14:02:48.107 に答える
1

あなたの ajax 呼び出しは非同期です。つまり、ajax 呼び出しが開始され、さらにコードの実行フローが続行されます。応答を待ちません。応答が最終的に受信されると、コールバックが実行されます。

あなたができることは、ajax呼び出しをすべてキューに積み上げ、各応答を受信すると、キュー内の次の呼び出しを開始することです。これにより、現在の ajax 呼び出しが完了するまで次の ajax 呼び出しが送信されないという望ましい効果が得られます。

多くの呼び出しがある場合、ブラウザーは同時に複数の ajax 呼び出しを簡単に処理できるため、必要になったときにすぐにすべての呼び出しを開始するよりもはるかに遅くなります。

于 2012-11-30T14:01:57.293 に答える
0

あなたはここで非同期です。それを行いたい場合、おそらくこれを達成する最も簡単な方法はasync.jsを使用することです

于 2012-11-30T13:57:46.257 に答える