【问题标题】:Is this JQuery deferred working properly?这个 JQuery deferred 工作正常吗?
【发布时间】:2014-05-26 03:47:33
【问题描述】:

这是有问题的代码行:

$.when(dashboard.update.call(this)).then(dashboard.updateCompleted);

问题是,dashboard.update 调用了另外一系列 5 个左右的函数。 dashboard.update 是在完成调用这些函数之后还是在这些函数实际完成之后完成?

我问的原因是因为似乎在dashboard.update 调用的函数完成之前调用了dashboard.updateCompleted。有没有办法解决这个问题?

【问题讨论】:

  • 这取决于这些函数是否使用异步执行.. 即它们是否有ajax请求等
  • 您必须向我们展示dashboard.update() 的作用(它是否具有异步操作)以及它是否返回仅在异步操作完成时才解析的承诺。 $.when().then() 只能在 dashboard.update() 内部执行异步操作,前提是 dashboard.update() 返回一个仅在异步操作完成时才解析的承诺。而且,如果这样做,您也不需要$.when(),因为您可以直接使用dashboard.update.call(this).then(...)
  • 我不确定dashboard.update里面的函数是否是异步的……不过它们是一系列的ajax请求。
  • @Hubrid 见帖子。谢谢
  • Welp,AJAX 的名字中确实有异步......所以是的,这些函数确实使用异步执行。

标签: javascript jquery callback jquery-deferred


【解决方案1】:

要使用when(),必须将延迟对象传递给when()中的函数。

我刚刚看到和你非常相似的情况。我为使代码工作所做的工作是:

$.when(func1($.Deferred()),
       func2($.Deferred()),
       func3($.Deferred()),
       func4($.Deferred())
).done(function() {
    alert('Finished!');
}

并且在每个函数中,必须调用resolved() 或rejected() 来通知$.when()。例如,

function func1(def) { 
    A_async_call(function (status) {
        if (status == OK) {
           def.resolve(); /// Tell $.when, this function finished
        } else {
           def.reject();  /// tell $.when, a function failed
        }
    })
    return def; // return defered object to when, for later use
}

【讨论】:

  • 你几乎不会通过 deferreds-to-be-resolved。将def 作为参数返回它对我来说似乎是一种反模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多