Node.js如何将代码转换为事件?

时间:2017-06-04 09:00:26

标签: javascript node.js events

首次运行Node程序时,提供给事件循环的第一个事件是如何/什么的?你的程序是不是一直在执行的顶级回调? (我认为这个顶级回调通常是" server.listen()"?)

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

这是对主脚本的评价。 (或者更确切地说,最终将评估主脚本的本机node.js代码首先放在V8事件循环中。)

  

你的程序是不是一直在执行的顶级回调?

不,整个时间都没有执行,每个回调都是自己执行的。

答案 1 :(得分:0)

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

我一直在考虑Runnables的任务队列方面的Node,这可能是问题所在。

是。 NodeJS没有任何与您提供的代码填充的任务qeue。 qeue由请求/计时器和其他东西填满。您的代码只提供了处理此类任务的方法。

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

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

//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。之后,我们的全局对象包含一个函数日志,我们的Task qeue如下所示:

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

在后台,有一个硬件计时器正在运行,它将在某些时候完成。

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

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

所以我们的日志第一次调用,然后我们的qeue为空,事件循环将停止/执行一些后台任务。

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

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

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

通常情况下,qeue已经完成了执行完成的计时器,请求应答和文件读/写成功处理。