22

私は少し前にjQueryでpromiseを使用しましたが、このシナリオに適用するのに問題があります。これを実現するには、$。when()メソッドと$ .done()メソッドを使用することを好みます。

私が理解していることから、リクエストをログに記録する$ .Deferredオブジェクトを作成する必要があり、それらのリクエストが終了したら、コールバックを起動します。以下の私のコードでは、コールバックは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()});
4

2 に答える 2

57

への引数$.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/ -- すべての成功メッセージの後に「完了」がコンソールに記録されることに注意してください。

于 2013-01-16T05:59:26.110 に答える
9

複数のリクエストとそのレスポンスを処理するのに役立つ簡単な例を紹介します。

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);
});
于 2016-10-10T18:21:17.720 に答える