2012-09-21 33 views
0

我有一个模块,有一个内部循环(使用'settimeout')。每次定时器发生时,我都想发起回调。我试图使用jQuery的Deferred对象,没有运气..喜欢的东西:使用jQuery的推迟与settimeout

$(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(); 
}; 

的问题是,计时器调用该方法内部,所以我不会有呼叫“于是(做某事);”的主要计划。我可以使用旧的学校函数回调(传递回调函数到模块),但我真的想尝试这些伟大的功能。

感谢,

的Yaniv

回答

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/

+0

好知道这一个。在我的情况下,我只需要一个回调就可以拨打所有的电话,这是不是有点矫枉过正? –

+0

如果你只保证有一个回调,那么它可能是。这取决于您的要求,以及您是否认为将来可能需要多次回调。 – dherman