遇到的一道关于javascript执行机制的面试题
setTimeout(() => {
console.log(1)
})
new Promise(resolve => {
console.log(2)
setTimeout(() => {
resolve(3)
})
Promise.resolve().then(() => {
console.log(4)
})
}).then((data) => {
console.log(data)
})
console.log(5)
// 问输出顺序
Javascript执行机制(setTimeout/Promise)
JS sleep
注意:
①同循环下 node.js中的process.nexttrick的微任务会比promise 的then微任务更优先
②浏览器和node.js的微任务执行机制有点区别。浏览器中同级的setTimeout是一个整体,他们间的微任务不在同一个队列。而nodejs中setTimout和他们的微任务都会被提取出来添加到同一个队列。
例如
console.log('1')
setTimeout(function () {
console.log('2')
new Promise(function (resolve) {
console.log('4')
resolve()
}).then(function () {
console.log('5')
})
})
new Promise(function (resolve) {
console.log('7')
resolve()
}).then(function () {
console.log('8')
})
setTimeout(function () {
console.log('9')
new Promise(function (resolve) {
console.log('11')
resolve()
}).then(function () {
console.log('12')
})
})
浏览器结果为:1,7,8,2,4,5,9,11,12
nodejs结果为:1,7,8,2,4,9,11,5,12
可以看到setTimeout函数的顺序就不一样了
浏览器下:setTimeout是一个整体,微任务在这个队列中,
整体的先执行主代码在执行微服务所以是
(2,4,5),(9,11,12)
括号代表一个setTimeout整体
nodejs下:setTimeout的主代码在宏任务队列,微任务在一个队列
(2,4,9,11),(5,12)
括号代表队列,第一个是setTimeout主代码执行队列,第二个是微任务队列
nodejs执行机制详解