gpt4 book ai didi

node.js - NodeJS 执行上下文

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:02 26 4
gpt4 key购买 nike

我正在尝试了解一点 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 函数注册一个匿名回调 (function(err,data)) 以便稍后执行(大概是在完成时)。它还安排自己的异步操作(告诉解释器它需要删除某些内容)。

  2. 运行 while 循环

  3. 解释器正在等待脚本结束,以查看是否还有其他事情要做(删除某些内容,并在稍后完成时运行计划的回调)。

  4. ...没有数字 4,因为 while 循环永远不会完成,因此永远不会到达脚本末尾,因此解释器没有机会自行运行任何内容。

在大多数其他语言(如 C 或 Python)中,异步库要求您执行自己的函数来运行事件循环。像这样的事情:

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

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

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

在 javascript 中,eventloop 不是一个库,它是内置的。因此,eventloop.run 在脚本末尾静默执行:

async_function(callback);

// eventloop runs here
<小时/>

附加答案

要获取异步工作的 while 循环(等待设置标志)的语义,您始终可以将其替换为 setIntervalsetTimeout 循环:

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 - NodeJS 执行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com