使用jquery延迟使用settimeout

时间:2012-09-21 20:46:40

标签: javascript jquery jquery-deferred deferred

我有一个内部循环的模块(使用'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

1 个答案:

答案 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/