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