私はしばらく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);
foobar は、配列の最後の要素が処理された後ではなく、ランダムな時間に呼び出されるようです。
どんな時に使った方が良いですか?
// 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 ループで「パイプ」を使うのは難しいと思います。
また、元のコードが「ほぼ動く」のはなぜですか?そこで何が起こっているのですか?遅延オブジェクトを関数のように実行していますか? また、実行するとどうなりますか?