在使用Promises的“fetch”事件之后,主干绑定到“重置”

时间:2014-03-31 14:50:58

标签: backbone.js promise

所以我有这个非常简单的用例:

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"的事件在这个基于承诺的解决方案中?

2 个答案:

答案 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执行注释的代码块。传入了productscategories,因为已使用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
    });
}