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)
我希望这有帮助
还有另一个迟到的答复,以防其他人遇到这个问题.
我最终覆盖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)
我假设您正在使用带有 jQuery 的主干。如果是这样,以下问题似乎为您提供了答案:
Backbonefetch返回xhr他们正在谈论的 IIRC。