如何检测所有Backbone ajax请求何时完成?

时间:2016-04-26 20:06:15

标签: javascript ajax backbone.js

我可以使用jQuery查看每个完成时间,但我需要所有主干ajax请求的开始和结束。

这样我就可以向用户提出并指示应用程序正在运行。

我可以将每个请求推送并弹出到阵列,但是想知道是否有更简单的方法?

  Backbone.ajax = function() {
    $A.report('BB - ajax called');
    var xhr = Backbone.$.ajax.apply(Backbone.$, arguments); 
    xhr.always(function(){
        $A.report('BB - ajax completed');
    });
    return xhr;
  };

这是一个解决方案:

  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.
  // Override this if you'd like to use a different library.
  var requestArray = [];
  Backbone.ajax = function() {
    var xhr = Backbone.$.ajax.apply(Backbone.$, arguments); 
    requestArray.push('mark');
    $A.report('BB - Ajax Started');
    xhr.always(function(){
        requestArray.pop();
        $A.report('BB - Ajax Completed');
        if(requestArray.length === 0){
            $A.report('BB - All Ajax Completed');
        }
    });
    return xhr;
  };

1 个答案:

答案 0 :(得分:0)

我使用一个依赖于内置事件的Backbones的简单模式。我主要使用它来显示/隐藏加载图标。在下面的示例中,我发出2个请求。在每次请求成功时,我增加一个计数器。如果该计数器达到2,我执行我想要的操作,通常隐藏加载图标并渲染视图。

var exampleView = Backbone.View.extend({
    waitToLoad:0,
    initialize:function(){
        var collection1 = new ExampleCollection();
        var collection2 = new ExampleCollection();
        this.listenTo(collection1,'sync',this.dataReady);
        this.listenTo(collection2,'sync',this.dataReady);
        collection1.fetch();
        collection2.fetch();
    },
    dataReady:function(){
        this.waitToLoad++;
        if(this.waitToLoad == 2){
            //all requests done
            this.render();
            this.waitToLoad = 0;
        }

    },
    render:function(){

    }
})