2012-05-09 18 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); 

因此,如果需要某个事件,则可以将其传入,否则将其忽略。

相关问题