这是我同时获取一些 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');
});
当我运行它时,done
在success
之前被记录到控制台。我做错了什么?
最佳答案
$.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/