【问题标题】:$.when - done gets called before all promises are resolved$.when - done 在所有承诺都解决之前被调用
【发布时间】:2014-09-14 00:31:25
【问题描述】:

这是我同时获取一些主干集合的代码:

$.when.apply(this, _.map(collection_params_pairs, function(pair) {
     pair.collection.fetch({
          data: pair.params,
          success: function(collection, response) {
            console.log('success');
          }
     });
})).done(function() {
    console.log('done');
});

当我运行它时,donesuccess 之前登录到控制台。我做错了什么?

【问题讨论】:

  • 您的_.map 返回什么?我看到它返回了一个undefined 的数组,因此无需等待when
  • 啊,周五晚上很难集中注意力。谢谢!
  • 似乎没有人告诉你你需要真正改变什么。在你的.map() 回调中,你需要返回一个$.when() 可以操作的promise。就像现在一样,您没有向$.when() 传递任何承诺,因此无需等待。

标签: javascript jquery backbone.js promise jquery-deferred


【解决方案1】:

$.when() 需要一组 Promise,以便它可以监视这些 Promise 并在所有这些 Promise 本身完成时触发您的 .done() 处理程序。您的代码的结构方式是将_.map() 的返回结果发送到$.when(),您需要从.map() 回调函数返回一个promise。

所以...假设pair.collection.fetch() 已经返回了一个promise(看起来它返回了一个作为promise 的jqXHR 对象),你可以这样做:

$.when.apply($, _.map(collection_params_pairs, function(pair) {
     return pair.collection.fetch({
          data: pair.params,
          success: function(collection, response) {
            console.log('success');
          }
     });
})).done(function() {
    console.log('done');
});

如果pair.collection.fetch() 没有返回承诺,那么您需要创建一个承诺才能使用$.when()

$.when.apply($, _.map(collection_params_pairs, function(pair) {
     var def = $.Deferred();
     pair.collection.fetch({
          data: pair.params,
          success: function(collection, response) {
            def.resolve(response);
            console.log('success');
          }
     });
     return def.promise();
})).done(function() {
    console.log('done');
});

仅供参考,您可能还应该在 pair.collection.fetch() 调用中处理错误,因为我认为它具有某种类型的错误路径。

【讨论】:

  • Backbone 的 collection.fetch 返回一个 jqXHR 对象,它是一个承诺 - 所以第二组逻辑(创建延迟)并不是真正需要的。
  • 只是一个小提示:“需要一个承诺数组”——它需要 N 个参数(可变参数?)
【解决方案2】:

在您的代码中调用_.map() 会返回一个undefined 数组,因此$.when() 不需要等待任何承诺。

因此它立即解决。

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 2016-01-10
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多