如何同步多个Backbone.js的取?(How to synchronize multiple B

2019-06-27 12:18发布

我是一个有点新的Backbone.js的,但我已经通过一切可以为我做深刻的印象,而且我努力学习的模式和最佳实践吧。

我有两个集合:

var CollA = Backbone.Collection.extend({
    model: ModelA,
    url: '/urlA'
});

var CollB = Backbone.Collection.extend({
    model: ModelB,
    url: '/urlB'
});

var collA = new CollA;
var collB = new CollB;

当加载我的应用程序,我需要获取无论是从服务器上的这些藏品,并运行一些引导代码时,它的保证回迁都已经完成。

以下是我做的,现在:

collA.fetch({success: function() {
    collB.fetch({success: function() {
        // run the needed code here.
    }});
}});

这个作品中,所需要的代码只能保证两者取成功完成后运行。 这显然是低效的,虽然,因为取连续运行,此起彼伏。

什么会是一个更好的方式来做到这一点,并行运行的取,然后运行一些代码,一旦两者取已成功完成?

Answer 1:

如果你正在使用jQuery,使用when

$.when(collA.fetch(),collB.fetch()).done(function(){
    //success code here.
});

背景:

  • http://api.jquery.com/jQuery.when/
  • http://documentcloud.github.com/backbone/#Collection-fetch

您可以在一个或多个deferreds传递给$.when 。 恰巧的是,“jqXHR”是集合返回实现诺言/递延接口,可以组合成使用新的承诺$.when 。 该请求将基本上是同时(当然,尽可能JavaScript允许),并传递给函数.done只有当两个取成功将执行。



Answer 2:

正如@JayC说,你可以用$.when从jQuery的,我更喜欢另一种选择是after函数(由下划线),这只是执行后预计呼叫结束一次。

http://underscorejs.org/#after

function runMyApp(){
  // run the needed code here.
  console.log('This will run one time but until both fetch are being completed.');
}

//2 because you have two collections
var renderApp = _.after(2, runMyApp);
collA.fetch({success: renderApp});
collB.fetch({success: renderApp});


Answer 3:

我喜欢@ JayC的回答,如果你有单独提取每个集合。 你可以说,一个取到服务器会更好,而不是多取。 如果您在获取应用程序加载这些数据,我会做一个调用服务器,然后将数据传递到您的收藏有关。 这确实取决于你有多少藏品对应用负载取,但老实说,我宁愿做一个呼叫,则服务器将数据传递给我的相关藏品。

$.ajax({
    url: "path/to/app-load-data"
}).done(function(data) { 
    collA = new CollA(data.collA);
    collB = new CollB(data.collB);
});

显然,这将取决于如果你可以操纵你的API和上述不遵循REST。 但话又说回来,你正在一个呼叫服务器,而不是多次调用。



文章来源: How to synchronize multiple Backbone.js fetches?