【问题标题】:Backbone fetch multiple collections to a single collectionBackbone 获取多个集合到单个集合
【发布时间】:2014-04-17 23:33:31
【问题描述】:

我有两个集合,我想合并到一个集合中,我不想使用 jquery $.when(A.fetch(), B.fetch()),因为 $.when 将在其中一个参数失败时立即执行失败回调,而我没有如果其中一个成功了,我仍然想用它进行渲染。

以下是我出来的方式。我想知道是否有另一种方法可以做到这一点,我们可以在没有种族条件的情况下同时做到吗?

A.fetch().then(function(json) {
     addToMyCollection(json);
}).always(function() {
      B.fetch().then(function(json){ 
           addToMyCollection(json);
      }).always(function() {
           renderViewWithMyCollection();
      });
});

【问题讨论】:

  • 是否可以选择使用更好的 promise 库? jQuery deferreds 是一个非常简约(而且相当残废)的实现。

标签: jquery backbone.js promise jquery-deferred


【解决方案1】:

您可能想利用 Backbone.Events :

var inject = function(collection) {
  C.add(collection.models)
}

A.on('sync', inject)
B.on('sync', inject)

C.on('add', function() { /* render c */ })

A.fetch()
B.fetch()

如果您只想合并一次,请使用once 而不是on

上述代码和您的实现之间的一个关键区别是渲染将发生两次,因此一旦第一个集合同步,第一个集合的项目就会被渲染,当两者都同步时,所有项目都会被渲染。

如果您想防止这种情况发生,您可以保留一个计数器,在将项目添加到 C 后将其递增并在渲染 c 之前对其进行检查。

【讨论】:

    【解决方案2】:

    与顺序代码不同,您可以在调用 promise 后等待它。

    var pA = A.fetch();
    var pB = B.fetch();
    pA.then(function(json){
         addToMyCollection(json); 
    }).always(function(){ // in better impls, finally
         pB.then(function(res){
             addToMyCollection(res);
         }).always(function(){
             renderViewWithMyCollection();
         });
    });
    

    或者,更简洁;

    var pA = A.fetch(), pB = b.fetch();
    pA.then(addToMyCollection).always(function(){
          return pB.then(addToMyCollection);
    }).always(renderViewWithMyCollection);
    

    你可以用:

    包装这个“完成”
    function always(promise){
         return promise.then(null,function(){}); // ignore rejection
    }
    

    然后做:

    $.when(always(A.fetch().then(addToMyCollection)),
           always(B.fetch().then(addToMyCollection))).
     then(renderViewWithMyCollection());
    

    当然,像 Bluebird 这样的真正 Promise 库已经内置了这种功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多