具有对象来存储数据。
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就开始执行它,并增加它的元素,那么没有事件被触发。 那可能吗? 能发生的呢?
如果是这样,怎么可以将此代码转换成线程安全的种-的?
JavaScript是单线程的。 函数不能被打断,所以你可以确保每个功能块将完成另一个开始之前。
(但是,如果一个功能,使异步调用,其他功能可以在异步操作开始之前执行。这并不在你的代码出现,不过,我可以看到,除了setTimeout
电话,你可以肯定这些将执行以正确的顺序。)
这岂不是更明智的传递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);
继@ 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);
因此,如果需要的情况下,你可以通过它,否则就让它出来。