我的骨干应用程序有很多视图。在视图之间切换会触发Ajax请求以获取不同的集合。如果启动新的请求,我想停止当前的“读取”ajax请求。有可能吗?
答案 0 :(得分:36)
好的,这就是我做的事情
我正在保存变量中的获取请求
app.fetchXhr = this.model.fetch();
在我的路由器中,我有一个负责关闭视图和渲染视图的函数。它还负责触发每个视图更改所需的任何触发器,但这与此问题无关。
在执行任何操作之前,此路由器功能执行以下
//Stop pending fetch
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){
app.fetchXhr.abort();
}
我希望这会有所帮助
答案 1 :(得分: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);
}
};
答案 2 :(得分:4)
我假设您正在使用jQuery的骨干。如果是这样,以下问题似乎为您提供了答案:
Abort Ajax requests using jQuery
Backbone fetch
会返回他们正在谈论的xhr
,IIRC。