遅延Ajax呼び出しの3層の深層チェーンがあり、理想的には、最も深い層が終了すると、約束を完全にキックします(Inceptionのようになります...「もっと深くする必要があります!」)。
問題は、私は一度に多くの(おそらく数百の)Ajaxリクエストを送信し、それらすべてが完了するまで延期する必要があることです。最後に行われたものに頼ることはできません。
function updateAllNotes() {
return $.Deferred(function(dfd_uan) {
getcount = 0;
getreturn = 0;
for (i = 0; i <= index.data.length - 1; i++) {
getcount++;
$.when(getNote(index.data[i].key)).done(function() {
// getNote is another deferred
getreturn++
});
};
// need help here
// when getreturn == getcount, dfd_uan.resolve()
}).promise();
};
.when()
と.apply()
を複数の遅延で使用できます。非常に便利:
function updateAllNotes() {
var getarray = [],
i, len;
for (i = 0, len = data.length; i < len; i += 1) {
getarray.Push(getNote(data[i].key));
};
$.when.apply($, getarray).done(function() {
// do things that need to wait until ALL gets are done
});
}
jQuery.When
doc。ajax呼び出しの1つが失敗すると、後続のすべてのajax呼び出しがまだ終了していなくても、fail
マスターコールバックが呼び出されます。この場合、すべての通話が終了したかどうかはわかりません。
すべての呼び出しを待ちたい場合は、結果がどうであっても、次のような別のDeferredを使用する必要があります。
$.when.apply($, $.map(data, function(i) {
var dfd = $.Deferred();
// you can add .done and .fail if you want to keep track of each results individualy
getNote(i.key).always(function() { dfd.resolve(); });
return dfd.promise();
});
答えブリットハロランをありがとう。私もアンダースコアを使用しているので、次のようにマップを使用してソリューションを非常にきれいに適用できました。
$.when.apply($, _.map(data, function(i) {
return getNote(i.key);
})).done(function() {
alert('Be Happy');
});
邪悪な便利。