使用$.Deferred()
等待异步调用然后从中获取数据。
到目前为止试过这个:http://jsfiddle.net/RMSbx/1/
var result = "";
function asyncCallWrapper () {
return $.Deferred(function(def) { asyncCallFunction(arg1, function ( //Fires a callback when completed
def.resolve(data);
)))
}
$.when(asyncCallWrapper ()).done(function (dataFromAsyncCall) {
alert(dataFromAsyncCall); // Alerts proper data
result = dataFromAsyncCall;
});
alert(result);// Empty string
如何访问result
外部完成()
答案 0 :(得分:1)
你无法摆脱异步。
$.Deferred
无法等待进行操作;相反,它可以在操作完成时运行回调
您必须将使用该值的代码放在then()
回调中。
答案 1 :(得分:1)
您的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。
$.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
});
阅读完评论后,我看到你想立即使用结果。延迟不可能做到这一点。您将不得不重构需要值的代码然后调用promise。