如何同步多个Backbone.js提取?

Jaa*_*nus 24 concurrency backbone.js

我对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;
Run Code Online (Sandbox Code Playgroud)

加载我的应用程序时,我需要从服务器获取这两个集合,并在确保两个提取都已完成时运行一些引导代码.

以下是我现在的表现:

collA.fetch({success: function() {
    collB.fetch({success: function() {
        // run the needed code here.
    }});
}});
Run Code Online (Sandbox Code Playgroud)

这样可以保证只有在两次提取成功完成后才能运行所需的代码.然而,这显然效率低下,因为取件一个接一个地连续运行.

什么是更好的模式来执行此操作,并行运行提取,然后在两次提取成功完成后运行一些代码?

Jay*_*ayC 51

如果您使用的是jQuery,请使用when:

$.when(collA.fetch(),collB.fetch()).done(function(){
    //success code here.
});
Run Code Online (Sandbox Code Playgroud)

背景:

您将一个或多个延迟传递给$.when.碰巧集合返回的"jqXHR"实现了promise/Deferred接口,可以将其组合成一个新的promise $.when.这些请求基本上是并发的(好吧,就像javascript允许的那样),传递给的函数.done只有在两次提取都成功时才会执行.


Dan*_*nda 28

正如@JayC所说你可以使用$.whenjQuery,我更喜欢的其他选项是after函数(来自Underscore),它在预期的调用完成后执行一次.

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});
Run Code Online (Sandbox Code Playgroud)

  • 从来不知道那个方便的小功能......!+1. (2认同)