私はいくつかの annc に取り組んでおり、それを良い方法で実装したいと思っています。
次のコードを検討してください
function getData(latency) {
var deferred = $.Deferred();
window.setTimeout(function () {
deferred.resolve(Math.random());
}, latency + 100);
return deferred.promise();
}
function getSpecialData() {
var deferreds = [];
for (var i = 0; i < 3; i++) {
deferreds.push(getData(1000 * i));
}
return $.when.apply($, deferreds);
}
function log(msg) {
$("#console").append("<li>" + msg + "</li>");
console.log(msg);
}
getData(3000)
.done(function () {
log("got 3000 data");
return getSpecialData()
.done(function () {
log("got special data");
});
})
.always(function () {
log("got all data");
});
ご覧のとおり、getData 関数と getSpecialData 関数の両方から promise を返しています。また、ご覧のようにこれらの関数への呼び出しを連鎖させています。さらに、getData done コールバック内から promise を返しています。
私は、遅延オブジェクトがそのコールバックが返すものを気にかけ、それが約束である場合は、その約束が解決されるのを待ってから、別のコールバックを待つことを期待していました。実際に起こっていることは、コールバック内から何を返すかを気にしないということです。順序は次のとおりです。
- getData を呼び出し、3 秒間
"got 3000 data"
情報を取得した後、 - 同時に getSpecialData とメッセージ付きの
always
コールバックを起動します"got all data"
私が達成したいのは、次の関数呼び出しの順序です。
- getData を呼び出し、3 秒間
"got 3000 data"
情報を取得した後、 - getSpecialData を呼び出し、3 秒後に
"got special data"
情報を取得し、 "got all data"
メッセージの直後。
私が望むように動作させるための最良のアプローチは何ですか?