ブラウザをロックせずに一連のNajaxリクエストを行う必要があり、これを実現するためにjquery遅延オブジェクトを使用したいと思います。
これは3つのリクエストを含む単純化された例ですが、私のプログラムは100を超えるキューを作成する必要がある場合があります(これは正確なユースケースではないことに注意してください。実際のコードは、次の実行前にステップ(N-1)の成功を確認する必要があります。ステップ):
$(document).ready(function(){
var deferred = $.Deferred();
var countries = ["US", "CA", "MX"];
$.each(countries, function(index, country){
deferred.pipe(getData(country));
});
});
function getData(country){
var data = {
"country": country
};
console.log("Making request for [" + country + "]");
return $.ajax({
type: "POST",
url: "ajax.jsp",
data: data,
dataType: "JSON",
success: function(){
console.log("Successful request for [" + country + "]");
}
});
}
コンソールに書き込まれる内容は次のとおりです(すべての要求は並行して行われ、応答時間は予想どおり各国のデータのサイズに正比例します。
Making request for [US]
Making request for [CA]
Making request for [MX]
Successful request for [MX]
Successful request for [CA]
Successful request for [US]
延期されたオブジェクトにこれらをキューに入れるにはどうすればよいですか?パイプに変更を加えてみましたが、同じ結果が得られます。
望ましい結果は次のとおりです。
Making request for [US]
Successful request for [US]
Making request for [CA]
Successful request for [CA]
Making request for [MX]
Successful request for [MX]
編集:
配列を使用してリクエストパラメータを保存するという提案に感謝しますが、jqueryの遅延オブジェクトにはリクエストをキューに入れる機能があり、この機能を最大限に活用する方法を学びたいと思っています。
これは事実上私がやろうとしていることです:
when(request[0]).pipe(request[1]).pipe(request[2])... pipe(request[N]);
ただし、各トラバーサルを効果的に使用するために、一度に1ステップずつパイプにリクエストを割り当てたいと思います。
deferred.pipe(request[0]);
deferred.pipe(request[1]);
deferred.pipe(request[2]);