美文网首页
[es6]async/await

[es6]async/await

作者: 钢铁萝莉猫 | 来源:发表于2019-12-13 10:29 被阅读0次

    遇到await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,继续执行await后面的代码。

           async function test1() {
                console.log('start test1'); // 1
                console.log(await test2()); //发生中断  //发生继续
                console.log('end test1'); // test2()执行完毕  // 7
            }
            async function test2() {
                console.log('test2'); // 2
                 // 从这里开始中断,跳出test1(),开始执行test1()外面的代码
                 // test1()外面的代码执行完毕后继续执行这里 // 6.1
                return 'return test2 value'  // 6.2
                //第一个宏任务执行完毕,开始执行微任务
            }
            test1();
            console.log('start async'); // 3 同步
            setTimeout(() => {  // setTimeout推入宏任务队列
                console.log('setTimeout');  //执行第二个宏任务 // 9
            }, 0);
            new Promise((resolve, reject) => {
                console.log('promise1'); // 4 同步
                resolve();
            }).then(() => {   // promise.then推入微任务队列<1> 
                console.log('promise2'); // // 8
            });
            console.log('end async'); // 5 同步(所有同步代码执行完毕)
    

    输出结果

    start test1
    test2
    start async
    promise1
    end async
    return test2 value
    end test1
    promise2
    setTimeout
    
    • 只有resolve()之后,传递给then时,then中的函数才会被推到微任务中
    • 一个微任务里面产生的新的微任务,是在当前微任务队列的后面添加,而不是下一轮的微任务。

    总结

    promise是立即执行的,它创建的时候就会执行,不存在将promise推入微任务中的说法;

    resolve()是用来表示promise的状态为fullfilled,相当于只是定义了一个有状态的Promise,但是并没有调用它;

    promise调用then的前提是promise的状态为fullfilled;

    只有promise调用then的时候,then里面的函数才会被推入微任务中;

    ————————————————————————————

    ps(愚见):

    • 宏任务:
      整体 script, setTimeout, setInterval,UI交互事件,setImmediate(Node.js)
    • 微任务:
      Promise, process.nextTick(Node 版 setTimeout,在event loop 的下一次循环中调用回调函数)

    相关文章

      网友评论

          本文标题:[es6]async/await

          本文链接:https://www.haomeiwen.com/subject/inxfnctx.html