24

私はBackbone.jsに少し慣れていませんが、Backbone.jsでできることすべてにすでに感銘を受けており、現在、パターンとベストプラクティスを学ぼうとしています。

私は2つのコレクションを持っています:

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.
    }});
}});

これは機能し、必要なコードは、両方のフェッチが正常に完了した後にのみ実行されることが保証されています。ただし、フェッチは次々にシリアルに実行されるため、明らかに非効率的です。

これを行うには、フェッチを並行して実行し、両方のフェッチが正常に完了したらコードを実行するためのより良いパターンは何でしょうか。

4

3 に答える 3

52

jQueryを使用している場合は、次を使用しますwhen

$.when(collA.fetch(),collB.fetch()).done(function(){
    //success code here.
});

バックグラウンド:

1つ以上の延期をに渡します$.when。コレクションが返す「jqXHR」は、を使用して新しいpromiseに組み合わせることができるpromise/Deferredインターフェースを実装することがあります$.when。リクエストは基本的に同時実行され(javascriptで許可されている限り)、渡された関数は.done両方のフェッチが成功した場合にのみ実行されます。

于 2012-08-28T22:48:37.023 に答える
28

@JayCがjQueryから使用できると言ったよう$.whenに、私が好む他のオプションは、after予想される呼び出しが完了した直後に1回実行される関数(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});
于 2012-08-29T13:34:26.600 に答える
2

各コレクションを個別に取得する必要がある場合は、@JayCの回答が好きです。サーバーへの単一のフェッチは、複数のフェッチよりも優れていると主張することができます。アプリケーションのロード時にこのデータをフェッチする場合は、サーバーを1回呼び出してから、関連するコレクションにデータを渡します。これは、アプリケーションの負荷時にフェッチする必要のあるコレクションの数によって異なりますが、正直なところ、サーバーを1回呼び出してから、関連するコレクションにデータを渡すことを好みます。

$.ajax({
    url: "path/to/app-load-data"
}).done(function(data) { 
    collA = new CollA(data.collA);
    collB = new CollB(data.collB);
});

これは明らかに、APIを操作でき、上記がRESTに準拠していないかどうかによって異なります。ただし、ここでも、複数の呼び出しではなく、サーバーに対して1つの呼び出しを行っています。

于 2012-08-29T07:15:27.467 に答える