5

有一个对象来存储数据。

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 开始执行并添加其元素,则不会触发任何事件。那可能吗?这会发生吗?

如果是这样,如何将此代码转换为某种线程安全的?

4

3 回答 3

5

JavaScript 是单线程的。一个功能不能被中断,因此您可以确保每个功能块将在另一个功能块开始之前完成。

(但是,如果一个函数进行异步调用,则其他函数可能会在异步操作开始之前执行。不过,这在您的代码中不会发生,我可以看到,除了setTimeout调用之外,您可以确定那些将在正确的顺序。)

于 2012-05-09T14:23:55.573 回答
4

eventsEnabled将in 作为参数传递给方法不是更明智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);
于 2012-05-09T14:12:03.417 回答
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);

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

于 2012-05-09T14:30:52.653 回答