通过节点中的事件修改变量 - 是否安全?

时间:2013-12-15 19:25:07

标签: javascript node.js

想象一下节点中的这种情况:

var output = '';

module1.on('done', function() {
    output += 'aaaa';
});

module2.on('done', function() {
    output += 'bbbb';
});

// ...Doing stuff...

// Assume this is inside a promise/callback and executed after both events have fired
console.log(output);

是否可以获得aabbaabb的输出?

2 个答案:

答案 0 :(得分:2)

没有。在并发环境中,race conditions可能会出现类似的状态,但Node中的Javascript执行本质上是单线程的。这些方法将以原子方式执行。

This question有一些很好的相关答案

话虽如此,在大多数语言中,字符串是不可变的(因此本质上是线程安全的),所以无论如何都应该像你的例子那样交错的字符串。

答案 1 :(得分:0)

  1. 使用promises等待每个模块完成 F.E. http://howtonode.org/promises

  2. 在每个模块中按照指定的顺序填充变量(只是一个没有承诺的想法):

    var output = ['',''];
    
    module1.on('done', function() {
        output[0] = 'aaaa';
    });
    
    module2.on('done', function() {
        output[1] = 'bbbb';
    });
    
    // ...Doing stuff...
    
    console.log(output.join(''));