2

我对 Node JS 很着迷并且已经开始深入研究,但是,来自 Java 背景,我对下面这样的示例感到困惑,其中进行了依赖共享变量来跟踪的异步调用链(以便确定何时他们都完成了执行另一个动作)。如果这个问题过于基本,我深表歉意,但是我一直在寻找这个问题并没有找到解释,我可能没有使用正确的术语。

如果你在 Java 中做了这样的事情,你需要使变量 n 同步以避免冲突,否则它的完整性可能会受到损害(这只是基于我阅读的一些更复杂的示例的伪代码,如果它不完美,对不起)

    var n = 100

var funct_a = function(callback) {
   return function() {
       if (n == 0)
         callback()
       else
         n--
    }
}

for ( a in someArray) {

  funct_a (function() {
     //do something with variable a...
 })
}

是不是这些只在一个“线程”中运行,因此它们实际上并没有在不同的 CPU 内核上运行,并且实际上不能同时写入变量?对于我来说,这似乎是解决这些类型冲突的一些核心节点服务器逻辑的唯一合乎逻辑的解释。任何可以阐明这一点的信息都值得赞赏。

4

2 回答 2

2

node.js单线程的,但听起来您更关心 JavaScriptclosures以及函数范围在 JavaScript 中的工作方式。如果您有其他一些可以访问的代码,n那么实际上,是的,您的callback()调用不会像您预期的那样运行。不过,从更高层次的角度来看,您应该知道 CommonJS 模块会阻止您的n变量成为 a global,因此除非您在模块内公开它或弄乱它,n否则不会被篡改。您可能已经知道这一点,但我建议您修改以下内容:

  • JavaScript 模块化模式;尤其是node.js的CommonJS,还要学AMD
  • JavaScript 函数范围
  • JavaScript 闭包

HTH 迈克

于 2012-08-28T04:05:20.197 回答
1

在 node.js 中,除了 I/O 操作之外,所有代码都是同步工作的。它与 Java 完全不同。尝试阅读这篇文章,它可能会帮助您理解。

于 2012-08-28T04:11:34.363 回答