所以我有这个非常简单的用例:
init: function() {
app.products = new app.Collections.Products();
app.categories = new app.Collections.Categories();
var collections = [app.products, app.categories];
var complete = _.invoke(collections, 'fetch');
$.when(null, complete).then(function(){
// fetched, but no models
});
};
从XHR的角度来看,这样可以正常工作,但在回调中,尚未创建各个集合的模型。有没有办法同时注意"重置"来自" fetch"的事件在这个基于承诺的解决方案中?
答案 0 :(得分:0)
您可以构建自己的延迟来协调您的呼叫。例如,您可以在集合的原型上添加此函数:
function promiseSync() {
var dfd = $.Deferred();
this.once('sync', function() {
dfd.resolve();
});
return dfd.promise();
}
app.Collections.Products.prototype.promiseSync = promiseSync;
app.Collections.Categories.prototype.promiseSync = promiseSync;
然后,就像你对请求所做的那样,结合延迟:
var syncs = _.invoke(collections, 'promiseSync');
$.when.apply(null, syncs).then(function(){
console.log('syncs');
});
演示http://jsfiddle.net/nikoshr/Xb9Mk/
请注意$.when.apply(null, array)
的使用情况。 $.when(null, array)
会立即解决,这可能就是您在回调中看不到模型的原因。
答案 1 :(得分:0)
使用此代码,您可以在填充模型的情况下获取产品和类别集合。
deferredFetch
函数设置延迟对象,并在填充集合后解析它。通过使用fetch
选项调用{reset: true}
,Backbone将填充集合并触发一个reset
事件,而不是多个add
事件。
init
只提取两个集合,then
执行注释的代码块。传入了products
和categories
,因为已使用reset
侦听器中的这些对象解析了延迟对象。
function deferredFetch(collection) {
var deferred = $.Deferred();
collection.once('reset', function(collection) {
deferred.resolve(collection);
});
collection.fetch({ reset: true });
return deferred;
}
init: function() {
app.products = new app.Collections.Products();
app.categories = new app.Collections.Categories();
$.when(deferredFetch(app.products), deferredFetch(app.categories))
.then(function(products, categories) {
// do yo thang
});
}