NodeJS执行上下文

我想了解一点NodeJS。 下面的逻辑被认为是,当readdir完成后,它将设置标志,以便while循环停止。 显然它不这样工作。 据我所知,这更像是一件事情,但是我想做的事情并不重要,我更关心它是如何工作的,为什么。 是因为while循环阻塞(?)?

var dirm = require('./dirm.js'); var flag = false; dirm(process.argv[2], process.argv[3], function(err, data) { flag = true; if (err) console.log(err); data.forEach(function(file) { console.log(file); }) }) while (flag == false) { console.log('Hey'); } 

它以这种方式工作:

  1. drim函数注册一个匿名的callbackfunction(err,data)function(err,data) ),稍后执行(大概是在完成的时候)。 它也安排自己的asynchronous操作(告诉解释器它需要一些东西)。

  2. 你运行while循环

  3. 解释器正在等待脚本的结束,看看是否还有其他的事情要做(什么时候什么时候,什么时候完成,在很长一段时间内运行预定的callback)。

  4. …没有数字4,因为while循环从来没有完成,因此脚本的结束是永远不会到达的,因此解释器没有机会自行运行任何东西。

在大多数其他语言如C或Python中,asynchronous库要求您执行自己的函数来运行事件callback。 像这样的东西:

 async_function(callback); eventloop.run(); // this allows the async function to work 

在这些语言中,很明显为什么在运行事件callback之前插入一个while循环意味着eventloop永远不会运行:

 async_function(callback); while (1) { /* do nothing */ } eventloop.run(); // never gets run 

在javascript中,eventloop不是libaray,它是内置的。 因此, eventloop.run在脚本结尾静静地执行:

 async_function(callback); // eventloop runs here 

附加答案

为了获得asynchronous工作的while循环的语义(等待一个标志被设置),你可以用setIntervalsetTimeout循环replace它:

 setInterval(function(){ if (flag == false) { console.log('Hey'); } },10); // check 100 times per second 

要停止setInterval只需调用clearInterval

 var loop = setInterval(function(){ if (flag == false) { console.log('Hey'); } else { clearInterval(loop); // stop the loop } },10); 

node.js中的Javascript是在事件循环中的一个线程中执行的,所以在while循环完成之前,没有办法执行asynchronouscallback。