有一个存储数据的对象。
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开始执行并添加其元素,则不会触发任何事件。那可能吗?会发生这种情况吗?
如果是这样,如何将此代码转换为线程安全的?
答案 0 :(得分: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);
答案 1 :(得分:3)
JavaScript是单线程的。函数不能被中断,因此您可以确保每个函数块在另一个函数块开始之前完成。
(但是,如果一个函数进行异步调用,其他函数可能会在异步操作开始之前执行。但是,除了setTimeout
调用之外,我还能看到你的代码中没有发生的事情。 ,你可以确定这些将以正确的顺序执行。)
答案 2 :(得分: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);
因此,如果需要一个事件,你可以传入它,否则就把它留下来。