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)