2012-05-09 12 views
1

データを格納するオブジェクトを持つ。JavaScript関数の実行を中断できますか?

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); 

第二には、トリガイベントが行われます。

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

質問ですが、最初の生産の二プロデューサーブレーク実行の流れをできますか? (イベントが再び有効になっているので、前と)

プロデューサー1の実行が終了する前に、イベントを無効にした場合、私は、意味は、プロデューサー2は、その実行を開始し、その後はイベントがトリガされませんその要素を追加します。それは可能ですか?それは起こることができますか?

もしそうなら、どのようにこのコードは、種類-のスレッドセーフであるように変換することができますか?

答えて

3

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

(しかし、関数が非同期呼び出しを行うと、非同期操作が始まる前に他の関数が実行される可能性があります。コード内ではsetTimeout呼び出しの他にも表示されます必ずそれらは正しい順序で実行されます)

4

eventsEnabledaddElementメソッドのパラメータとして渡すのは賢明でしょうか?

まず
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); 

setInterval(function() { 
    store.addElement('bye',true); 
}, 12000); 
+0

あなたは私にこれを打つ! :) – bPratik

+0

グランドアドバイスJamiec、あなたは+1を持っています。 apsillersは私の質問に答えました。 –

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); 

イベントが必要な場合はこのように、あなたはそれを残して、他の、それを渡すことができます。

関連する問題