浏览器Event Loop
    所有同步任务都在主线程上执行,形成一个执行栈
    主线程外,还存在一个“任务队列”(task queue),只要一步任务有了运行结果,就在任务队列中放置一个事件
    一旦执行栈中所有同步事件之星完毕,系统就会读取任务队列里面的任务

    宏任务:settimeouttime,setInerval,setImmediate,I/O,UI rendering
    微任务: process.nextTick,promise,Object.oaserve

    Node Event Loop
    node.js启动的时候就会初始化一个event loop,每一个event loop都包含6个阶段
    timers:执行settimer 和setInterval调度的回调函数
    I/O:此阶段执行几乎所有的回调函数,除了cloase callbacks和timer里的回调函数,以及setTmmediate
    Idle(空转):此阶段只在内部使用
    Poll(轮询):检索新的I/O事件,在有些时候Node会阻塞这个阶段
    Check: setImmediate
    close callback

    比较复杂的就是poll阶段

    • 如果poll queue不为空eventloop同步执行poll里面的call back
    • 如果poll queue为空,
      • 看是否有setImmediate的callback,如果有,就执行setImmediate的callback
      • 如果poll queue队列为空,就阻塞在这里,等待callback进来执行
    • 如果进入poll阶段,但是有timmer的callback,poll会检测是否有timmer的callback,如果有,就进入下一个循环,执行timmer queue
    • process.nexttick在每个阶段的转换期间执行

    process.nexttick应用场景
    利用cpu空闲时间处理密集计算
    提供异步方式调用