2012-08-23 2 views
7

複数ページのコレクションを取得します。すべてのフェッチがいつ完了するかを知る方法を探しています。私はきれいなコードでこれを達成できるかバックボーン:複数のフェッチが続行されるのを待ちます。

app.collections.Repos = Backbone.Collection.extend({ 
    model: app.models.Repo, 
    initialize: function(last_page){ 
    this.url = ('https://api.github.com/users/' + app.current_user + '/watched'); 

    for (var i = 1; i <= last_page; i++) { 
     this.fetch({add: true, data: {page: i}}); 
    }; 
    }, ... 

任意のアイデア:ここに は私のコレクションのように見えるものでしょうか?

答えて

13

使用jQueryのdeferreds

var deferreds = []; 
for (var i = 1; i <= last_page; i++) { 
    deferreds.push(this.fetch({add: true, data: {page: i}})); 
}; 

$.when.apply($, deferreds).done(function() { 
    ... 
    <CODE HERE> 
    ... 
} 

(私は実際にこれをテストしていませんが、私はそれが動作するはずだと思う。)when

jQueryのドキュメント:

する方法を提供します1つまたは複数のオブジェクト(通常、非同期イベントを表すDeferredオブジェクト)に基づいてコールバック関数を実行します。

と役立つかもしれない別の答え: How do you work with an array of jQuery Deferreds?

2

1つのオプションは、underscore.js "after -function(docs)を使用することですが、それは追加のLOTがあるでしょうので、-callback成功を使用して必要 - イベント:

initialize: function(last_page){ 
    this.url = ('https://api.github.com/users/' + app.current_user + '/watched'); 

    var self = this; // save a reference to this 

    var successCallback = _.after(function() { 

    self.trigger('allPagesFetched'); //trigger event to notify all listeners that fetches are done 

    }, last_page); // this function will be called when it has been called last_page times 

    for (var i = 1; i <= last_page; i++) { 
    this.fetch({add: true, data: {page: i}, success: successCallback}); 
    }; 
}, 

希望がこれを助けました!

関連する問題