Javascript Node.js中意外的vm.runInThisContext控制流
我正在编写一个Node.js脚本,如下所示:Javascript Node.js中意外的vm.runInThisContext控制流,javascript,node.js,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('li
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最初是为web编写的,因此它们不进行任何文件系统调用,也不做任何其他事情,据我所知,这些调用会意外地变得异步
Library1.js设置Library2.js需要的一些全局变量
输出为(转换为本例):
如果我在library1中手动插入另一条注释,其中设置了全局变量(在library1中的另一个函数中,在library1结束之前调用),该注释表示“我已被设置”,我会得到以下结果(如中所示,无更改):
如果我手动插入一个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(){
对于(变量i=0;i<100000;i++){
console.log('x');
}
console.log('loopedX');
}
函数y(){
console.log('startedY');
}
x();
y();
这会输出大量的“x”和“startedY”,这似乎确认了节点在移动到下一个函数之前完成了一个函数的工作(直到它返回)。好的,因此这在Node.js中不是意外行为,只是大型库(YUI)中的意外(未知)行为。YUI执行了一些异步加载,这是我在变量被分配到时没有预料到的。仍在寻找解决方案,但这是一个YUI问题,而不是Node.js问题 我建议将此线程留在这里,以防有人有相同的问题,这样他们就会发现问题可能是他们的库而不是节点造成的
started1
ended1
I've been set
started2
ended2
function x() {
for ( var i = 0; i < 100000; i++ ) {
console.log('x');
}
console.log('loopedX');
}
function y() {
console.log('startedY');
}
x();
y();