0

$.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外部完成()

4

2 回答 2

1

你无法摆脱异步

$.Deferred不能等待操作;相反,它可以在操作完成时运行回调。
您必须将使用该值的代码放在then()回调中。

于 2013-06-03T17:28:51.720 回答
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 包装在 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 上调用。

于 2013-06-17T19:11:16.310 回答