1

次のように、各モデルで非同期メソッドを呼び出すメソッドを持つバックボーン コレクションがあるとします。


getStatus: function() {
  this.each(function(model) {
    model.getStatus();
  });
}

モデル クラスでは、非同期の ajax 呼び出しが次のように行われます。


getStatus: function() {
  $.ajax({
    //ajax properties here
  });
}

すべてのモデルが非同期呼び出しを完了して (必ずしも成功するとは限りません)、いつ戻ってきたかを判断するにはどうすればよいですか?

したがって、私のコレクションでは、getStatusSuccessこれらすべての非同期呼び出しが完了した後に実行されるメソッドが必要です。私はjQuery deferredsを調べ、それを機能させるためにいくつかのことを試みましたが、役に立ちませんでした。ただし、遅延を使用して解決できると私はまだ信じています。

4

3 に答える 3

2
  • $.ajaxDeferred オブジェクトを返します
  • Deferred オブジェクトを組み合わせjQuery.whenて、「マスター」Deferred を作成できます。

    複数の Deferred オブジェクトが jQuery.when に渡される場合、このメソッドは、渡されたすべての Deferred の集約状態を追跡する新しい「マスター」Deferred オブジェクトから Promise を返します。
    このメソッドは、すべての Deferred が解決されるとすぐにそのマスター Deferred を解決するか、Deferred の 1 つが拒否されるとすぐにマスター Deferred を拒否します。

  • Backbone は、コレクションの Underscore から多くの関数をプロキシします。特に_.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/

于 2013-08-22T01:23:22.760 に答える
0

呼び出しを延期する 2 つの方法を提案できます。

  1. $.when()上記のnikoshrによって完全に説明されているjQueryの構築
  2. または Underscore_.after(count, function)メソッド。基本的に 2 つの引数を取ります。非同期呼び出しの量と defer の呼び出しです。
于 2013-08-23T09:30:12.710 に答える
0

Sequence of operation in Node.js で最近の回答を確認してください。

基本的にAsync.jsを使用できます。その並列機能を確認してください..

于 2013-08-21T21:28:14.707 に答える