5

データを保存するオブジェクトを持つ。

var store = {
    elements: [],
    eventsEnabled: true,
    addElement: function(element) {
        this.elements.push(element);
        if (this.eventsEnabled) {
            // Code that triggers event, calls handlers... whatever
        }
    }
};

データを保存するという行為は、2つのイベント(2つのプロデューサーの種類)から発生します。最初の「プロデューサー」はイベントをトリガーしません。

setInterval(function() {
    store.eventsEnabled = false;
    store.addElement('hello');
    store.eventsEnabled = true;
}, 12000);

2番目はイベントをトリガーします:

setInterval(function() {
    store.addElement('bye');
}, 7000);

問題は、2番目のプロデューサーが最初のプロデューサーの実行フローを中断できるかどうかです。

つまり、プロデューサー1がイベントを無効にし、実行を終了する前(したがって、イベントが再び有効になる前)に、プロデューサー2が実行を開始して要素を追加した場合、イベントはトリガーされません。それは可能ですか?それは起こり得ますか?

もしそうなら、このコードを一種のスレッドセーフに変換するにはどうすればよいですか?

4

3 に答える 3

5

JavaScriptはシングルスレッドです。機能を中断することはできないため、各機能ブロックが別の機能ブロックを開始する前に完了することを確認できます。

(ただし、関数が非同期呼び出しを行う場合、非同期操作が開始する前に他の関数が実行される可能性があります。ただし、コードでは発生しませんが、呼び出し以外に、これらの関数がsetTimeout確実に実行されることがわかります。正しい順序。)

于 2012-05-09T14:23:55.573 に答える
4

メソッドeventsEnabledへのパラメーターとしてinを渡す方が賢明ではないでしょうか。addElement

var store = {
    elements: [],
    addElement: function(element,eventsEnabled) {
        this.elements.push(element);
        if (eventsEnabled) {
            // Code that triggers event, calls handlers... whatever
        }
    }
};

初め:

setInterval(function() {
    store.addElement('hello',false);
}, 12000);

2番:

setInterval(function() {
    store.addElement('bye',true);
}, 12000);
于 2012-05-09T14:12:03.417 に答える
0

@Jamiecの提案に加えて、イベント関数を渡すことも検討できます。

var store = {
    elements: [],
    addElement: function(element, callback) {
        this.elements.push(element);
        if (callback !== undefined) {
            callback();
            // Common code that triggers event, calls handlers... whatever
            alert("I'm Common Event Code");
        }
    }
};​

そのように使用されます:

setInterval(function() {
    store.addElement('hello', function(){ alert("I'm Special Event Code!"); });
}, 12000);

したがって、イベントが必要な場合は、それを渡すことができます。それ以外の場合は、そのままにしておくことができます。

于 2012-05-09T14:30:52.653 に答える