$ .when - 在所有承诺解决之前调用完成

时间:2014-09-13 01:49:13

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

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

$.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');
});

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

2 个答案:

答案 0 :(得分:4)

$.when()需要一组承诺,以便它可以监控这些承诺并在所有承诺完成后触发您的.done()处理程序。使用_.map()发送给$.when()的返回结果构建代码的方式,您需要从.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()没有返回承诺,那么您需要创建一个承诺才能使用$.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()电话上处理错误,因为我认为它有某种类型的错误路径。

答案 1 :(得分:3)

代码中的

_.map()调用返回undefined数组,因此$.when()没有任何等待的承诺。

因此它会立即解决。