javascript - $.when - done 在所有 promises 被解决之前被调用

标签 javascript jquery backbone.js promise jquery-deferred

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

$.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 之前被记录到控制台。我做错了什么?

最佳答案

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

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

$.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() 没有返回一个 promise,那么您需要创建一个以使用 $.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() 调用的错误,因为我认为它有某种类型的错误路径。

关于javascript - $.when - done 在所有 promises 被解决之前被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819072/

相关文章:

javascript - ASP.NET MVC3 表单集合在 jQuery ajax post 期间为 0

当你在页面上点击 'back' 时的 javascript 事件?

javascript - Angularjs - 使用 $anchorScroll 后需要单击后退按钮两次

javascript - Bootstrap 模态仅有时打开

javascript - 如何将mvc View javascript代码传输到单独的js文件

javascript - 为什么 Backbone.Collection 对第一个查看者显示两次?

backbone.js - 在backbone.js中渲染 Collection View

javascript - Backbone 路由匹配不起作用

javascript - Node 和 Angular cookie 路径

c# - 通过 jquery post 将字符串数组传递到 ASP.net