我是一个有点新的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.
}});
}});
这个作品中,所需要的代码只能保证两者取成功完成后运行。 这显然是低效的,虽然,因为取连续运行,此起彼伏。
什么会是一个更好的方式来做到这一点,并行运行的取,然后运行一些代码,一旦两者取已成功完成?
如果你正在使用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
只有当两个取成功将执行。
正如@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});
我喜欢@ JayC的回答,如果你有单独提取每个集合。 你可以说,一个取到服务器会更好,而不是多取。 如果您在获取应用程序加载这些数据,我会做一个调用服务器,然后将数据传递到您的收藏有关。 这确实取决于你有多少藏品对应用负载取,但老实说,我宁愿做一个呼叫,则服务器将数据传递给我的相关藏品。
$.ajax({
url: "path/to/app-load-data"
}).done(function(data) {
collA = new CollA(data.collA);
collB = new CollB(data.collB);
});
显然,这将取决于如果你可以操纵你的API和上述不遵循REST。 但话又说回来,你正在一个呼叫服务器,而不是多次调用。