我有一个具有多个视图的主干应用程序。在视图之间切换会触发 Ajax 请求以获取不同的集合。如果启动一个新请求,我想停止当前的“读取”ajax 请求。是否可以?
问问题
9829 次
3 回答
38
好的,这就是我所做的
我将获取请求保存在变量中
app.fetchXhr = this.model.fetch();
在我的路由器中,我有一个负责关闭视图和渲染视图的功能。它还负责触发每个视图更改所需的任何触发器,但这与这个问题无关。
在做任何事情之前,这个路由器函数会执行以下操作
//Stop pending fetch
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){
app.fetchXhr.abort();
}
我希望这有帮助
于 2012-10-15T15:49:22.530 回答
11
另一个迟到的回复,以防其他人遇到这个问题。
我最终覆盖了 Backbone.sync 以添加一个 XHR 对象池和一个选项来中止在获取时挂起的请求。
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);
}
};
于 2013-08-02T19:47:54.047 回答
5
于 2012-10-05T15:43:51.110 回答