3

私はしばらくjquery遅延オブジェクトを研究してきましたが、1つのことに困惑しています。

「done」、「always」、「then」などのメソッドは、遅延オブジェクトが解決されたときに呼び出される関数を引数として取ります。

ただし、遅延オブジェクトを「always」メソッドに渡すことでリクエストをチェーンしようとしましたが、それもうまくいくようです:

// A is an array of data
var req = ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure);
for (var i = 1 ; i < A.length ; i++) {
  var tmp = ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure);
  req.always(tmp);
  req = tmp;
}

ただし、実際には機能しません。上記のコードを次のように実行すると、次のようになります。

req.always(foobar);

foob​​ar は、配列の最後の要素が処理された後ではなく、ランダムな時間に呼び出されるようです。

どんな時に使った方が良いですか?

// A is an array of data
var req = $.when(ajax(url + "?d=" + A[0]).done(processResults).fail(reportFailure));
for (var i = 1 ; i < A.length ; i++) {
  req = $.when(req, ajax(url + "?d=" + A[i]).done(processResults).fail(reportFailure));
}
req.always(foobar);

上記のコード (「when」を使用) では、ajax リクエストが次々に発生するのでしょうか、それとも同時に発生するのでしょうか?

ところで、「パイプ」を使ったチェインも検討しましたが、スコーピングの問題から、上記のように for ループで「パイプ」を使うのは難しいと思います。

また、元のコードが「ほぼ動く」のはなぜですか?そこで何が起こっているのですか?遅延オブジェクトを関数のように実行していますか? また、実行するとどうなりますか?

4

1 に答える 1

2

配列を構築し、javascript applyを使用する必要があります。

//create an array of one deferred per element
var requests =  $.map(A, function(index, a){return= $.ajax(url + "?d=" + a);});
//merge all deferreds into a single one
var mergedRequest = $.when.apply(null, requests);

mergedRequest.done(function(res0, res1, ...){
   //your code goes here
   //if you want results as an array just use arguments
   arguments.length == A.length;
});

編集:呼び出しを連続して行う場合は、次のようにします。

var result = $.ajax(url + "?d=" + A[0]);
for (var i = 1 ; i < A.length ; i++) {
  result = result.pipe(function() {
    return $.ajax(url + "?d=" + a[i]);
  }
}
result.done(processResults).fail(reportFailure);
于 2011-09-29T21:37:23.943 に答える