可以JavaScript函数的执行被中断?(Can JavaScript function exec

2019-06-24 06:33发布

具有对象来存储数据。

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就开始执行它,并增加它的元素,那么没有事件被触发。 那可能吗? 能发生的呢?

如果是这样,怎么可以将此代码转换成线程安全的种-的?

Answer 1:

JavaScript是单线程的。 函数不能被打断,所以你可以确保每个功能块将完成另一个开始之前。

(但是,如果一个功能,使异步调用,其他功能可以在异步操作开始之前执行。这并不在你的代码出现,不过,我可以看到,除了setTimeout电话,你可以肯定这些将执行以正确的顺序。)



Answer 2:

这岂不是更明智的传递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);


Answer 3:

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

因此,如果需要的情况下,你可以通过它,否则就让它出来。



文章来源: Can JavaScript function execution be interrupted?