我有一个代表处理视频的javascript对象。在视频处理过程中,我每隔5000
毫秒向服务器发送一个请求,一旦处理完毕,它应该取消绑定并完成。问题是,每次检查服务器是否完成时,它都会重新呈现自身的实例,并绑定额外的5000
毫秒超时。结果发生指数循环,最终会使浏览器崩溃。
由于此事件处理程序,我发生了循环错误:
initialize: function() {
this.on('all', this.reset_auto_refresh, this);
this.auto_refresh();
},
投放此initialize()
方法后,它会绑定reset_auto_refresh
并运行auto_refresh
。
auto_refresh: function(timeout) {
if(this.is_processing()) {
if(!timeout) timeout = 5000;
var callback = _.bind(function() {
this._timer = null;
this.fetch({error: _.bind(function() { this.reset_auto_refresh(15000); }, this)});
this.auto_refresh();
}, this);
this._timer = setTimeout(callback, timeout);
}
},
reset_auto_refresh: function(timeout) {
if(this._timer) clearTimeout(this._timer);
this.auto_refresh(timeout);
}
因为每次实例化时,它在技术上都是一个不同的对象,我找不到任何实例共享单个._timer
的方法,并且因此,他们不断添加新的setTimeout,即使已经存在且正在运行。
有人知道最佳做法,或者阻止多个实例在此设置setTimeout的方法吗?