2012-09-21 4 views
0

내부 루프가있는 모듈이 있습니다 ('settimeout'사용). 타이머가 발생할 때마다 콜백을 시작하려고합니다. 내가 뭔가처럼 .. 행운과 jQuery의 지연 개체를 사용하여 시도 :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

A는 정말 연기 당신이이 한 번 거래이기 때문에 찾고있는 것이 아니다 - 당신이 가능성이 원하는 것은 콜백 목록입니다.

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

관련 문제