私は少し前にjQueryでpromiseを使用しましたが、このシナリオに適用するのに問題があります。これを実現するには、$。when()メソッドと$ .done()メソッドを使用することを好みます。
私が理解していることから、リクエストをログに記録し、それらのリクエストが終了したときに、コールバックを起動する$ .Deferredオブジェクトを作成する必要があります。以下の私のコードでは、コールバックが発生していますbefore ajaxリクエストの後ではなく、-たぶん私は少し眠る必要があります
コードが不完全であることはわかっていますが、forループを追加してコードを適用するのに苦労しています。
http://jsfiddle.net/whiteb0x/MBZEu/
var list = ['obj1', 'obj2', 'obj3', 'obj4', 'obj5'];
var callback = function() {
alert("done");
};
var requests = [];
var ajaxFunction = function(obj, successCallback, errorCallback) {
for(i = 0; i < list.length; i++) {
$.ajax({
url: 'url',
success: function() {
requests.Push(this);
}
});
}
};
$.when($.ajax(), ajaxFunction).then(function(results){callback()});
$.when
の引数は、$.ajax
の戻り値である必要があります。これも、個別に呼び出す必要はありません。これは意味がありません。あなたはこのようなものが欲しいです:
for (i = 0; i < list.length; i++) {
requests.Push($.ajax(...));
}
$.when.apply(undefined, requests).then(...)
.apply
が必要な理由は、$.when
が複数の引数を取ることができるが、引数の配列をとることができないためです。 .apply
は基本的に次のように展開されます。
$.when(requests[0], requests[1], ...)
これは、リクエストが任意の順序で完了できることも前提としています。
http://jsfiddle.net/MBZEu/4/ -すべての成功メッセージの後に「done」がコンソールに記録されることに注意してください。
複数のリクエストとその応答を処理するのに役立つ簡単な例を共有します。
var arr = [
$.ajax({url:"test1.php"}),
$.ajax({url:"test2.php"}),
$.ajax({url:"test3.php"})
];
$.when.apply( undefined, arr ).then(function() {
var objects=arguments;
console.dir(objects);
});