2012-08-23 3 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를 문서 :

가 할 수있는 방법을 제공합니다 하나 이상의 객체 (일반적으로 비동기 이벤트를 나타내는 지연 객체)를 기반으로 콜백 함수를 실행합니다.

그리고 도움이 될 다른 답변 : How do you work with an array of jQuery Deferreds?

2

하나의 옵션은 underscore.js 'after α- 함수 (docs)를 사용하는 것입니다,하지만 추가 기능이 많이있을 것입니다 때문에, -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}); 
    }; 
}, 

희망이 있습니다.

관련 문제