Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中意外的vm.runInThisContext控制流_Javascript_Node.js - Fatal编程技术网

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

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

我正在编写一个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最初是为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();