如何在完成多个异步调用后延迟Backbone中的调用



如果我有一个主干集合,它有一个方法,可以在它的每个模型上调用异步方法,如下所示:


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。检查它的并行函数。。

可以建议两种推迟呼叫的方法:

  1. jQuery $.when()结构,这是nikoshr在上面完美描述的
  2. 或者Undercore _.after(count, function)方法,该方法基本上有两个参数:异步调用的数量和要延迟的调用

最新更新