[es6]async/await

2019-12-13  本文已影响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

总结

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

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

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

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

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

ps(愚见):

上一篇 下一篇

猜你喜欢

热点阅读