在切换路由时清理请求和回调
Clean up requests and callbacks when switching routes
我有一个骨干应用程序,从API加载一些数据到图表中。这个应用程序有几个选项卡,可以通过导航来访问这些不同的图表,每个选项卡执行一条路线。每个图表都是ChartView的一个实例,其中包含了相应的数据。
我有一个问题,这是由一些API调用可能需要一段时间引起的。当请求花费的时间太长时,一些用户开始在选项卡中快速循环,一个接一个地快速执行每个路由。这将触发所有的集合获取,最终导致接口混乱,因为一些回调将做一些渲染。
所以我的问题是,我怎么能确保每次加载一个新的路由(即使它是在快速连续完成),所有挂起或启动的请求被停止,所以没有"请求成功"回调被触发?
我建议,重写Backbone。视图移除方法。使用常规的stoppllistening,中止ajax调用,也设置一个像this.removed=true
这样的标志。在你的渲染函数中检查移除的标志,如果存在不渲染。如果点击完成得非常快,您可能需要在拨打任何电话之前检查它。
基于Ravi Hamsa的回复,我实现了一个对象,它被注入到每条路由中,以保存请求和路由是否仍然相关。
它看起来像这样:
var RouteContext = function RouteContext() {
this._xhrs = {};
this.stopped = false;
this.manageRequest = function(xhr) {
this.xhrs.push(xhr);
}
this.stop = function() {
this.stopped = true;
_.invoke(this.xhrs, 'abort');
}
}
我重写了主干。路由器路由方法如下:
route: function(route, name, callbackFactory) {
var callback;
if (_.isFunction(callbackFactory)) {
var context = new RouteContext();
callback = callbackFactory(context);
// When a new route is opened, this route should be stopped and all
// corresponding jqXHR's should be aborted.
App.mediator.on('tabClicked', function() {
context.stop();
});
} else {
callback = callbackFactory;
}
return Backbone.Router.prototype.route.call(this, route, name, callback);
}
我现在可以用这个上下文创建一个新的路由方法,像这样:
var routeFactory = function(routeContext) {
// Might do some route initialisation here.
return function() {
this.reset(routeContext);
// This function is the actual function that will be called when a route is triggered.
if (routeContext.stopped === false) {
myView.renderChart();
}
}
};
// Register the route on the router.
myRouter.route('route', 'name', routeFactory);
因为路由可以被多次调用,所以当路由再次被调用时,我将RouteContext重置回它的原始状态。
在我的路由中,我一直在检查我需要渲染的地方是否routeContext。停止仍然是假的。
相关文章:
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 在openshift node js应用程序中获取请求
- 反应路由器弄乱了请求网址
- 在我的情况下,如何进行http请求
- 使用密码对话框Javascript请求帮助
- servlet中的请求对象,而不是从jsp接收参数值
- 否'访问控制允许来源'标头存在于IISNOde中请求的资源(AngularJS+NodeJs)上
- JavaScript代码未正确检查ajax请求
- node.js请求数据事件未在CORS ajax调用中触发
- 用户请求和AJAX/资源请求之间的差异
- 如何发送带有get参数的ajax请求和post请求
- 区分HTTP请求和Ajax请求