NodeJS执行上下文

邱dy

我试图了解一点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');
}
slebetman

它是这样工作的:

  1. drim函数注册一个匿名回调(function(err,data)),以便稍后执行(大概是在完成时)。它还安排了自己的异步操作(告诉解释器它需要修饰某些内容)。

  2. 您运行while循环

  3. 解释器正在等待脚本结束,以查看是否还有其他事情要做(对某事进行整理,并在稍后的时间执行该操作,运行计划的回调)。

  4. ...没有数字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循环的语义(等待设置标志),您始终可以将其替换为setIntervalorsetTimeout循环:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

执行上下文混乱

来自分类Dev

上下文已处理。执行异步

来自分类Dev

执行上下文JavaScript的可变环境

来自分类Dev

了解经典执行上下文示例

来自分类Javascript

npm:在上下文中执行?

来自分类Dev

[[作用域]]和执行上下文

来自分类Dev

JavaScript中的执行上下文

来自分类Dev

执行上下文在JavaScript中

来自分类Dev

Javascript-上下文执行阶段

来自分类Dev

执行上下文和return语句

来自分类Dev

程序的执行上下文是什么?

来自分类Dev

Web组件-什么是执行上下文?

来自分类Dev

Play的执行上下文与Scala Global

来自分类Dev

星号拨号计划:执行上下文

来自分类Dev

CancellationToken.Register执行上下文

来自分类Dev

JavaScript执行上下文顺序

来自分类Dev

Sidekiq作业执行上下文

来自分类Dev

nodejs访问主脚本上下文

来自分类Dev

Javascript中的执行上下文和执行上下文对象

来自分类Dev

scala的执行上下文和播放的执行上下文之间有什么区别

来自分类Dev

lambda是否在调用脚本的上下文或定义的脚本的上下文中执行?

来自分类Dev

NodeJS云上下文搜索API(按上下文)

来自分类Dev

cron任务是在什么上下文中执行的?

来自分类Dev

Slick 2.1 / 3执行上下文用法的最佳实践

来自分类Dev

如果取消上下文,则终止函数执行

来自分类Dev

上下文切换与并行执行

来自分类Java

Hibernate查询中@RestController执行了@Transactional上下文

来自分类Dev

执行请求期间节点CLS上下文下降

来自分类Dev

在其他窗口的上下文中执行功能?