节点如何处理计算和事件循环

时间:2018-07-24 06:53:21

标签: node.js event-loop

for(var i = 0; i < 100000; i++){ 
    setTimeout(function(){
        console.log("Inside")
    }, 0);
    console.log("Outside") 
};

它给出输出:

外部* 100000

内部* 100000

为什么要输出?

CPU绑定的活动是在线处理的,当所有CPU绑定的活动结束时,它将处理事件que?

1 个答案:

答案 0 :(得分:0)

setTimeout()是非阻塞的,它异步地调用它的回调。这意味着setTimeout()运行,为将来安排计时器,然后立即返回。然后,在某个时间之后,当计时器触发时,它将在事件队列中插入一个事件。当解释器执行完其他Javascript后,它将从事件队列中提取下一个事件,然后将运行计时器回调。

因此,这就是您的代码中发生的事情:

  1. 运行for循环的主体100,000次,每次循环,安排一个计时器,然后输出console.log("Outside")
  2. 然后,当for循环完成并且控制权返回系统时,检查事件队列以查看是否存在事件。
  3. 由于所有计时器都设置为0,因此队列中可能有很多计时器事件。拉出第一个事件并运行它的回调,该回调将输出console.log("Inside")
  4. 重复直到事件队列中没有更多事件为止(这将需要100,000次迭代来处理您之前设置的所有计时器)。

这里有两个键:

  1. setTimeout()是“非阻止”。它安排了计时器并立即返回。
  2. 当计时器触发时,它会在事件队列中插入一个事件以运行计时器回调,并且只有在JS解释器完成了其他工作之后,该回调才会被调用,然后可以从该事件中获取下一个事件队列。

这意味着所有同步代码首先都必须先完成,然后才能从事件队列中获取任何异步回调并运行。