这是我的代码,用于同时获取一些主干集合:
$.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
之前登录到控制台。我做错了什么?
答案 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()
没有任何等待的承诺。
因此它会立即解决。