你的 asyncCallWrapper 函数应该返回一个 promise 而不是 deferred。延迟用于内部控制代码何时/如何完成。
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 包装在 deferred 中。
$.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;
});
alert(result) 是一个空字符串的原因是因为实际工作还没有发生。在代码中,您只需告诉应用程序在 asyncCallWrapper 完成时应该做什么。它还没有完成它在这一点上的工作。
在您的情况下,您希望在稍后设置数据后读取数据。这就是延迟的好处。
asyncCallWrapper()
.done(function(dataFromAsyncCall) {
alert(dataFromAsyncCall);
result = dataFromAsyncCall;
})
.then(function() {
alert(result);//should be dataFromAsyncCall
});
阅读您的评论后,我看到您想立即使用结果。这对于延期是不可能的。您将不得不重构需要调用该值的代码,然后在 Promise 上调用。