web-dev-qa-db-ja.com

配列からの複数のajax呼び出しと、完了時にコールバックを処理する

私は少し前に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()});
18
user1982408

$.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」がコンソールに記録されることに注意してください。

51
Explosion Pills

複数のリクエストとその応答を処理するのに役立つ簡単な例を共有します。

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);
});
7
Kanabos