【问题标题】:Backbone: Wait for multiple fetch to continueBackbone:等待多次获取继续
【发布时间】:2012-08-18 12:59:47
【问题描述】:

我获取多个页面的集合,我正在寻找一种方法来了解所有获取何时完成。 这是我的收藏的样子:

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

知道如何用干净的代码实现这一点吗?

【问题讨论】:

    标签: javascript jquery backbone.js


    【解决方案1】:

    使用 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 -function (docs),但这需要使用success -callback,因为会有很多add -events:

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

      希望这有帮助!

      【讨论】:

        猜你喜欢
        • 2020-05-07
        • 1970-01-01
        • 2016-08-16
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 2021-04-26
        相关资源
        最近更新 更多