我有一个内部循环的模块(使用'settimeout')。我想在每次定时器发生时触发回调。我尝试使用jQuery的延迟对象而没有运气..类似于:
$(function(){
var module = new MyModule();
$.when(module.init()).then("DO Something");
});
function MyModule(){
this.d = $.Deferred();
}
test.prototype.init = function(){
clearTimeout(this.next);
var self = this;
/* Do Something */
self.d.resolve();
this.next = setTimeout(function(){
self.init(); /* The problem is here - internal call to self */
}, 4000);
return self.d.promise();
};
问题是计时器在内部调用方法,因此我不会调用“.then(Do Something);”主程序。我可以使用旧的函数回调(将回调函数传递给模块)但我真的想尝试这些很棒的功能。
谢谢,
参见Yaniv
答案 0 :(得分:2)
延迟真的不是你想要的,因为这是一次性交易 - 你可能想要的是一个回调列表。
jQuery提供了$ .Callbacks(),这可能就是你要找的东西。
function MyModule(){
this._initCallbacks = $.Callbacks();
}
MyModule.prototype.onInit = function( cb ) {
if ( typeof cb === "function" ) {
this._initCallbacks.add( cb );
}
};
MyModule.prototype.init = function(){
clearTimeout( this.next );
var self = this;
this._callbacks.fire();
this.next = setTimeout(function(){
self.init();
}, 4000);
return this;
};
$(function(){
var module = new MyModule();
module.onInit(function() {
console.log( "Do something" );
});
module.init();
});
JSFiddle:http://jsfiddle.net/SUsyj/