如果我有一个主干集合,它有一个方法,可以在它的每个模型上调用异步方法,如下所示:
getStatus: function() {
this.each(function(model) {
model.getStatus();
});
}
在模型类中,异步ajax调用如下所示:
getStatus: function() {
$.ajax({
//ajax properties here
});
}
如何确定每个模型何时完成异步调用(不一定成功)并返回?
因此,在我的集合中,我需要一个getStatusSuccess
方法,它在所有这些异步调用完成后执行。我已经研究了jQuery延迟,并尝试了一些方法来让它发挥作用,但没有成功。然而,我仍然相信,使用延期可以解决这个问题。
$.ajax
返回一个Deferred对象-
您可以将Deferred对象与
jQuery.when
组合以生成"主"Deferred在将多个Deferred对象传递给jQuery.when的情况下,该方法从一个新的"主"Deferred object返回Promise,该对象跟踪已传递的所有Deferred的聚合状态
一旦所有Deferred在延期将被拒绝。 -
Backbone在集合上代理Undercore的许多函数,尤其是
_.invoke
,它返回一个带有调用结果的数组 function.apply
将允许您调用具有给定上下文和作为数组提供的参数的函数
综合所有这些:
var M = Backbone.Model.extend({
getStatus: function() {
return $.ajax({
// ...
});
}
});
var C = Backbone.Collection.extend({
model: M,
getStatus: function() {
var jqXHRs = this.invoke('getStatus');
return $.when.apply(this, jqXHRs);
}
});
var c = new C([
{id: 1},
{id: 2}
]);
c.getStatus().always(function() {
console.log('done');
});
还有一个演示http://jsfiddle.net/nKDjW/
在Node.js.中的操作序列中查看我最近的答案
基本上你可以使用Async.js。检查它的并行函数。。
可以建议两种推迟呼叫的方法:
- jQuery
$.when()
结构,这是nikoshr在上面完美描述的 - 或者Undercore
_.after(count, function)
方法,该方法基本上有两个参数:异步调用的数量和要延迟的调用