2012-05-09 16 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 
     } 
    } 
}; 

存儲數據的行爲來自兩個事件(兩種生產者的種類)。一是「生產者」不會觸發任何事件:

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

第二次卻觸發事件:

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

的問題是,可先製作人的第二個生產突破執行流程?我的意思是,如果生產者1禁用事件,並且在完成執行之前(並且因此在事件再次被啓用之前),生產者2開始執行並且添加其元素,則不會觸發事件。那可能嗎?會發生嗎?

如果是這樣,該代碼如何轉換爲種類線程安全的?

回答

3

JavaScript是單線程。一個函數不能被中斷,所以你可以確定每個函數塊都會在另一個函數塊開始之前完成。 (但是,如果一個函數進行異步調用,其他函數可能會在異步操作開始之前執行,但在您的代碼中不會發生這種情況,除了調用setTimeout之外,我可以看到,您可以確保這些會以正確的順序進一步執行)

4

eventsEnabled作爲參數傳遞給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); 

第二:

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

你打我這個! :) – bPratik

+0

盛大的建議Jamiec,你有我的+1。阿普萊爾斯回答了我的問題。 –

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

因此,如果需要某個事件,則可以將其傳入,否則將其忽略。

相關問題