您的asyncCallWrapper函數應該返回一個promise而不是延遲。延期是爲了在內部用來控制何時/如何完成代碼。
function asyncCallWrapper() {
return $.Deferred(function(def) { asyncCallFunction(arg1, function (//Fires a callback when completed
def.resolve(data);
))).promise();//return the deferred's promise instead of the deferred itself.
}
$ .when是一個效用函數,用於在延遲中包裝多個promise。
$.when(asyncCallWrapper(), asyncCallWrapper(), asyncCallWrapper())
.done(function(dataFromAsyncCall1, dataFromAsyncCall2, dataFromAsyncCall3) {
console.log("<ALL> three async calls are successful");
});
因此,沒有必要,你可以只寫
asyncCallWrapper()
.done(function(dataFromAsyncCall) {
alert(dataFromAsyncCall);
result = dataFromAsyncCall;
});
原因警報(結果)是一個空字符串,因爲實際工作中還沒有發生。在代碼中的這一點,你只需告訴應用程序在asyncCallWrapper完成時應該做什麼。目前還沒有完成它的工作。
對於您的情況,您希望在稍後設置數據之後讀取數據。這是推遲的好處。
asyncCallWrapper()
.done(function(dataFromAsyncCall) {
alert(dataFromAsyncCall);
result = dataFromAsyncCall;
})
.then(function() {
alert(result);//should be dataFromAsyncCall
});
看完你的評論後,我看到你想立即使用結果。這對於延期是不可能的。您將不得不重構那些需要價值的代碼,然後根據承諾進行調用。
你需要學習如何使用承諾。 – SLaks