【问题标题】:jQuery Deferred usagejQuery 延迟使用
【发布时间】:2013-06-03 17:27:36
【问题描述】:

我使用$.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

如何在 done() 之外访问result

【问题讨论】:

  • 你需要学习如何使用 Promise。

标签: jquery asynchronous jquery-deferred


【解决方案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
  });

在阅读了您的 cmets 之后,我看到您想立即使用结果。这对于延期是不可能的。您将不得不重构需要调用该值的代码,然后在 Promise 上调用。

【讨论】:

    【解决方案2】:

    你无法摆脱异步

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

    【讨论】:

    • 正在将值返回给其他函数,这样行吗?正确的语法是什么? $.when(fun()).done().then() ?
    • 你可以返回另一个 promise 对象,但你不能返回一个值。当您尝试返回它时,该值将不存在。在保持异步的同时无法解决这个问题。
    • @2-Stroker:不;只是回报承诺。 return fun()return fun.then(function (r) { ... }).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多