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开始执行并添加其元素,则不会触发任何事件。 那可能吗? 这会发生吗?
如果是这样,如何将此代码转换为线程安全的?
JavaScript是单线程的。 函数不能被中断,因此您可以确保每个function块在另一个function块开始之前完成。
(但是,如果一个函数进行异步调用,其他函数可能会在异步操作开始之前执行。但是在代码中不会发生这种情况,除了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);
因此,如果需要一个事件,你可以传入它,否则就把它留下来。