【问题标题】:Modifying a variable via events in node - is it safe?通过节点中的事件修改变量 - 安全吗?
【发布时间】:2013-12-15 19:25:07
【问题描述】:

在节点中想象这个场景:

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 这样的输出?

【问题讨论】:

  • 默认线程安全,因为 javascript 由 1 个线程调用。现在让我们想想 webworker?

标签: javascript node.js


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了,谢谢你的解释和链接!
【解决方案2】:
  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(''));
    

【讨论】:

  • 感谢您的回复。关于[1],模块需要并行运行,我应该澄清一下。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2012-03-16
  • 2017-03-08
  • 2017-01-23
  • 2023-04-05
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多