1. 允许nodejs执行非阻塞i/o操作,尽管JavaScript是单线程的。
    2. 由于现代内核模型是多线程的,所以他们可以在后台处理多个操作,当其中的一个操作完成时,内核会告诉Node.js将适当的回调添加到poll队列,以便最终执行。
    3. 当Node.js启动时, 会初始化一个时间循环,处理提供的脚本如异步api调用,定时器,或者调用process.nextTick(), 然后处理事件循环image.png

    一共有六个阶段,分别为times, pending callbacks, idle prepare, poll, check,close callbacks
    每个阶段都有一个FIFO的队列,队列里是待执行的回调。当进入一个给定的阶段,会执行任何指定的操作,然后去执行对应队列中的回调,知道队列为空或者达到回调最大执行次数,就会进入下一阶段,循环往复

    1. timers: 执行定时器回调,如由setTimeOut和setInterval产生的回调
    2. pending callbacks:执行延迟到下一个迭代的I/O回调
    3. idle, prepare:内部调用
    4. poll: 获取新的I/O事件;执行I/O相关的回调(除了close callback,定时器回调); node在适当的时机会阻塞在这里等待请求
    5. check:setImmediate()回调会被调用
    6. close callbacks: some close callbacks会在这里执行,比如socket.on(“close”,….)