Node.js中意外的vm.runInThisContext控制流

时间:2012-07-03 20:11:27

标签: javascript node.js

我正在编写一个如下所示的Node.js脚本:

var vm = require('vm');
var fs = require('fs');

vm.runInThisContext("console.log('started1');" + fs.readFileSync('library1.js') + "console.log('ended1');");

vm.runInThisContext("console.log('started2');" + fs.readFileSync('library2.js') + "console.log('ended2');"));

Library1.js和library2.js最初是为网络编写的,因此据我所知,他们不会进行任何文件系统调用或任何其他会出现意外异步的内容。

Library1.js设置了Library2.js需要的一些全局变量。

输出(转换为此示例):

started1
ended1
started2
ERROR, global variable was undefined and a property access caused the script to die

如果我在库1中手动插入另一个注释,其中设置了全局变量(在library1中的另一个函数内,在库1结束之前立即调用),表示“我已被设置”,我得到了这个(如,没有变化):

started1
ended1
started2
ERROR, global variable was undefined and a property access caused the script to die

如果我手动插入一个甚至一秒钟的setTimeout,那么我得到这个:

started1
ended1
I've been set
started2
ended2

这里可能会发生什么?显然有一些我不期望的异步行为。会是什么呢?对我来说很奇怪的是,library1脚本实际上完全结束了,我仍然得到这个错误。如果有一些线程被生成来处理library1中的函数调用,这种行为是有意义的,但我的理解是,当Node.js是非阻塞时,它不会为每个函数调用生成新线程。我错了吗?是单线程还是在所有被调用的函数上分时?在这一点上只是猜测我,试图理解这种行为。

写下以下内容只是为了测试Node是否像我想的那样工作,它似乎确实如此:

function x() {
    for ( var i = 0; i < 100000; i++ ) {
        console.log('x');
    }
    console.log('loopedX');
}

function y() {
    console.log('startedY');
}

x();
y();

这会输出很多'x'后跟'startedY',这似乎确认Node在完成一个函数(直到它返回)之前完成工作,然后再移动到下一个函数。

1 个答案:

答案 0 :(得分:0)

好的,所以这最终不是Node.js中的意外行为,只是大型库(YUI)中的意外(未知)行为。 YUI做了一些异步加载,我并不期望在分配变量时抛弃它。仍然在寻找解决方案但是作为YUI问题而不是Node.js问题。

我建议把这个帖子留在这里以防万一有人遇到同样的问题,所以他们发现可能是他们的库导致问题而不是Node。