Node.js如何将你的代码转换成事件?

当你第一次运行你的节点程序时,怎样提供给事件循环的第一个事件是什么? 您的程序是否像顶级callback一直在执行? (我会认为这个顶级callback通常是“server.listen()”?)

我对事件循环是否存在于正在运行的“main”脚本(或入口点)之外存在困惑,或者如果事件循环运行“main”脚本本身

实际上。 事件循环是包装所有js代码执行的机制,只要有待处理的事件就不会停止。

提供给事件循环的第一个事件是什么?

这是对主要剧本的评价。 (或者说,将最终评估你的主脚本的本地node.js代码是首先放在V8事件循环上的)。

您的程序是否像顶级callback一直在执行?

不,一直没有执行,每个callback都是自己执行的。

我想这个问题只是基于一些误会。 所以让我们从bascis开始:

我一直以Node Runnables的任务队列的方式来思考,这可能是问题所在。

是。 NodeJS没有什么待办事项,由您提供的代码填充任务qeue。 这个qeue被请求/定时器和其他东西填满。 你的代码只是提供方法来处理这些任务。

我对事件循环是否存在于正在运行的“main”脚本(或入口点)之外存在困惑,或者如果事件循环运行“main”脚本本身

第一个。 首先parsingjs,当代码退出时,事件循环开始。

 //parse + execute the js while(true){} //this code never enters the event loop as the global scope js is blocking 

第一个事件是如何提供给事件循环的?

我们不知道。 它可能是一个计时器,用户请求,文件准备等。

让我们看一个示例代码:

 //on start this js is parsed, qeue, heap and the global object are constructed //a function is stored on the global object function log(){ console.log("Hi, im logged"); } //the function pointer of log is pushed to the qeue process.nextTick(log); //a hardware timer is initialised setTimeout(log,1000); //the parser ends, nodejs enters the event loop 

起初,js被parsing。 之后,我们的全局对象包含一个函数日志,我们的Task Qeue如下所示:

 qeue=[ log ] //was added trough process.nextTick 

在后台,一个硬件计时器正在运行,这将完成一些时间。

现在JS引擎进入事件循环。 事件循环处理这个qeue。 所以看起来像这样(伪代码):

 while(true){ execute(qeue.shift()) } 

所以我们的日志被称为第一次,那么我们的qeue是空的,事件循环将停止/做一些后台任务。

一秒钟后,计时器结束并推送login到qeue:

 function timer_finishes(){ qeue.push(log); } 

所以现在我们的qeue包含另一个执行的函数。

通常情况下,这个qeue是完整的计时器来执行,请求回答和文件读/写成功处理。