jQuery延期使用

时间:2013-06-03 17:27:36

标签: jquery asynchronous jquery-deferred

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

2 个答案:

答案 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。