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

deferred は、実際にはあなたが探しているものではありません。これは 1 回限りの取引であるためです。必要になる可能性があるのは Callback リストです。

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 に答える