MST
星途 面试题库

面试题:Node.js 中微任务与宏任务的执行顺序

请描述在 Node.js 环境下,以下代码的输出顺序,并解释原因。 ```javascript console.log('start'); process.nextTick(() => { console.log('nextTick callback'); }); Promise.resolve().then(() => { console.log('promise then'); }); setImmediate(() => { console.log('setImmediate callback'); }); console.log('end'); ```
12.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 输出顺序
    • start
    • end
    • nextTick callback
    • promise then
    • setImmediate callback
  2. 原因解释
    • console.log('start');console.log('end');:这两个是同步代码,会按照顺序依次执行,所以先输出start,然后输出end
    • process.nextTick(() => { console.log('nextTick callback'); });process.nextTick的回调函数会在当前执行栈清空后,优先于Promise微任务和setImmediate执行。它的任务会被放入nextTickQueue,只要当前执行栈一清空,就开始执行这个队列中的任务,所以在startend输出后,会输出nextTick callback
    • Promise.resolve().then(() => { console.log('promise then'); });Promisethen回调属于微任务,会在当前宏任务执行完,并且nextTickQueue中的任务执行完后,才会执行微任务队列中的任务,所以promise thennextTick callback之后输出。
    • setImmediate(() => { console.log('setImmediate callback'); });setImmediate的回调函数会被放入immediateQueue,它是在当前轮询阶段结束时执行,所以是最后输出的。它的执行顺序在Promise微任务之后,因为Promise微任务是在当前宏任务执行完的阶段就执行,而setImmediate要等到下一个轮询阶段。