0

我有一个具有内部循环的模块(使用'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);” 的主程序。我可以使用老式函数回调(将回调函数传递给模块),但我真的很想尝试这些很棒的功能。

谢谢,

亚尼夫

4

1 回答 1

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/

于 2012-09-21T20:54:55.150 回答