我试图了解一点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');
}
它是这样工作的:
该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
orsetTimeout
循环:
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句