由于js单线程的特性,当多个任务同时执行时,碰到异步时,不可避免的会面临着谁先谁后的问题,这就涉及到js排队执行机制。机制自己去百度,然后上这里直接看代码。
console.log('a');
new Promise(resolve => {
console.log('b')
resolve()
}).then(() => {
console.log('c')
setTimeout(() => {
console.log('d')
}, 0)
})
setTimeout(() => {
console.log('e')
new Promise(resolve => {
console.log('f')
resolve()
}).then(() => {
console.log('g')
})
}, 100)
setTimeout(() => {
console.log('h')
new Promise(resolve => {
resolve()
}).then(() => {
console.log('i')
})
console.log('j')
}, 0)
答案:a,b,c,h,j,i,d,e,f,g
js执行逻辑如下,第一步扫描执行上下文,同步任务立即执行,于是有了a,b,异步任务放入宏任务队列(promise.then是微任务会先于settimeout执行,于是有了c,then里面的setTimeout则被压入宏任务队列)。第二步主进程依优先级拿出宏任务队列之一,开始执行,第三个setTimeout 0秒优先级最高,于是有了h,先同步再异步,于是先j,后i。然后是第一个promise里面的setTimeout 0秒执行优先级最高,于是有了d,最后是第二个setTimeout 100毫秒执行,先同步后异步,所以有e,f,g。 简单明了。