Promise微任务

1.起因

在看了“浏览器工作原理与实践=》浏览器中的页面循环系统=》宏任务和微任务”的章节后,我了解了微任务的执行时机:当前函数执行完成之前会依次执行当前函数上下文中的微任务队列。那么在一个函数中new Promise执行顺序是什么呢?如下:

function test(resolve, reject){
    console.log(3);
    resolve(4);
}

function main(){
    console.log(1)
    const a = new Promise(test)
    a.then(val=>{
        console.log(val)
    })
    console.log(2)
}
main()

2.Promise产生微任务的时机

上文的代码执行完后顺序为:

1
3
2
4

这个情况跟我理解的微任务相违背“当前函数执行完成之前会依次执行当前函数上下文中的微任务队列”,Promise作为微任务执行之后至少1紧接着是2,但我却忽略了微任务产生的时机:使用 Promise,当调用 Promise.resolve() 或者 Promise.reject() 的时候,会产生微任务。
所以上述代码执行回调test函数时,并不会产生微任务,而是正常顺序执行的。

3.验证微任务比宏任务优先执行

function test(resolve, reject){
    console.log(3);
    resolve(4);
}

function main(){
    console.log(1)

    setTimeout(() => {
        console.log(5)
    }, 1)

    let j =0
    for (let i = 0; i < 1000000000; i++) {
            j++
    }

    const a = new Promise(test)
    a.then(val=>{
        console.log(val)
    })

    console.log(2)
}

main()

PS:这里的验证不严谨,但大概也能描述出宏任务和微任务执行的顺序,执行结果如下:

1
3
2
4
5

Promise微任务

上一篇:Laravel Admin命令行


下一篇:CF1458C Latin Square