是否可以阻止Backbone"读取"请求

Xer*_*rri 20 jquery backbone.js backbone-views

我有一个拥有许多视图的主干应用程序.在视图之间切换会触发Ajax请求以获取不同的集合.如果启动新的请求,我想停止当前的"读取"ajax请求.可能吗?

Xer*_*rri 36

好的,这就是我做的

我正在保存变量中的获取请求

app.fetchXhr = this.model.fetch();
Run Code Online (Sandbox Code Playgroud)

在我的路由器中,我有一个功能,负责关闭视图和渲染视图.它还负责触发每个视图更改所需的任何触发器,但这与此问题无关.

在执行任何操作之前,此路由器功能执行以下操作

//Stop pending fetch
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){
    app.fetchXhr.abort();
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助


Gar*_*son 9

还有另一个迟到的答复,以防其他人遇到这个问题.

我最终覆盖Backbone.sync以添加XHR对象池和一个选项来中止fetch上的待处理请求.

var sync = Backbone.sync
  , xhrPool = [];

Backbone.sync = function(method, model, options) {
  options = options || {};
  if (method === 'read') {
    if (options.abortPending == true) {      
      for (var i = 0; i < xhrPool.length; i++) {
        if (xhrPool[i]['readyState'] > 0 && xhrPool[i]['readyState'] < 4) {
          xhrPool[i].abort();
          xhrPool.splice(i, 1);
        }
      }
    }

    // cleanup xhrPool
    // todo: make removal from the pool an 'always' jqXHR callback
    // instead of cleanup on every read?
    for (var i = 0; i < xhrPool.length; i++) {
      if (xhrPool[i]['readyState'] === 4) {
        xhrPool.splice(i, 1);
      }
    }

    var xhr = sync(method, model, options);
    xhrPool.push(xhr);
    return xhr;
  } else {
    return sync(method, model, options);
  }
};
Run Code Online (Sandbox Code Playgroud)


Jay*_*ayC 5

我假设您正在使用带有 jQ​​uery 的主干。如果是这样,以下问题似乎为您提供了答案:

使用 jQuery 中止 Ajax 请求

Backbonefetch返回xhr他们正在谈论的 IIRC。