複数のajaxクエリを同時に実行しているので、最後のクエリが返されるのを待ってから、すべてのajax呼び出しで成功ハンドラーを実行します。簡単な例として、次のことを考慮してください。
$.ajax({//ajax call 1
url:page1.php,
success: function(data1){
//do something with data1
}
});
....
$.ajax({//ajax call 2
url:page2.php,
success: function(data2){
//do something with data2
}
});
//consider more than just two concurrent requests
すべてのリクエストが同時に送信されたとしましょう。それらは非同期であるため、異なる時間に戻ります。一方のリクエストが戻るのに100ミリ秒かかり、もう一方のリクエストが戻るのに3000ミリ秒かかるとします。どちらが最初に戻るか最後に戻るかは明らかにわかりません。それらはすべて何らかの方法でDOMを更新し、1回の更新でそれらの変更を一度にビューアに表示したいと思います。どうすればよいですか?
私が考えることができる最善の方法は、data1とdata2をグローバル変数として保存することです。そして、成功が返されるたびにカウントするカウンター変数を用意します。次に、counter == TOTAL_NUM_REQUESTSでupdateAll()のような関数を呼び出し、すべてのグローバル変数を実行して、必要な場所に配置します。しかし、これは厄介でエラーが発生しやすいようです。さらに、それは多くのグローバル変数になります。
私が理想的に望んでいるのは、成功ハンドラーが戻ったときにスリープ状態にし、すべてが返されたものとしてカウントするという条件で、すべてのハンドラーにウェイクアップメッセージを送信すると、実行を再開できるようにすることです。これは最もクリーンなようですが、javascriptlandでこのような機能を認識していません。
誰かがこれについて何か巧妙なアイデアを持っていますか?
回答の更新
以下のリーのおかげで、私は解決策を得ることができました。私の解決策は彼の以下のように見えました。async
$.ajax呼び出しに割り当てられた変数のリストを作成します。最初は、これらのajax呼び出しの成功ハンドラーがまだ呼び出されていたので、それらを削除して、作成したこのwhen
ブロックによって後で呼び出される別の関数に配置しました。results
私はこのような関数に渡しました:
var results = [];
results.push(async1);
results.push(async2);
... for all the results ...
$.when.apply(this, results).done(function() {
for(var i=0;i<arguments.length;i++){
dataobject=arguments[i][0]
if(dataobject.variousattribute)
mySuccessHandlerFirstGuy(dataobject)
else if(dataobject.anotherattribute)
mySuccessHandlerSecondGuy(dataobject)
//etc ....
}
};
引数オブジェクトは、それが何であるかを理解するために少し手間がかかりました。それは2D配列(リストのリスト)でした。最初のインデックスは、特定のajaxリクエストに対応する返されたオブジェクトを表しています。順調に見えますが、サーバーが検索できるものを返し、それに応じてif/elseブロックを作成するのが最善です。次に、その特定の要素には、そのリスト内に3つの要素があるように見えます。1つ目は、サーバーから返された値、つまり必要な値です。2番目は常に文字列でしたsuccess
。これはおそらく呼び出しが機能したかどうかを確認するために使用できます。そして、そのリストの3番目の要素は、最初のリクエストのようです(わかりませんが)。これは私には役に立たなかった。
とにかく、これが将来誰かに役立つことを願っています。そして、私を正しい方向に向けてくれたリーにもう一度感謝します。