首次运行Node程序时,提供给事件循环的第一个事件是如何/什么的?你的程序是不是一直在执行的顶级回调? (我认为这个顶级回调通常是" server.listen()"?)
答案 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已经完成了执行完成的计时器,请求应答和文件读/写成功处理。