我想了解一点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');
}
答案 0 :(得分:1)
node.js中的Javascript在事件循环中的单个线程中执行,因此在while循环完成之前无法执行异步回调。
答案 1 :(得分:1)
它的工作原理如下:
drim
函数注册稍后要执行的匿名回调(function(err,data)
)(可能是在完成时)。它还安排自己的异步操作(告诉解释器它需要钻一些东西)。
您运行while循环
解释器正在等待脚本结束以查看是否还有其他事情要做(稍微干一点,以及何时在稍后的时间运行预定的回调)。
...没有数字4,因为while循环永远不会完成,因此永远不会到达脚本的结尾,因此解释器没有机会自行运行任何东西。
在大多数其他语言(如C或Python)中,异步库要求您执行自己的函数来运行eventloop。像这样:
async_function(callback);
eventloop.run(); // this allows the async function to work
在这些语言中显而易见的是,为什么在运行eventloop之前插入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
要获取while
循环的语义(等待设置标志)异步工作,您始终可以用setInterval
或setTimeout
循环替换它:
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);