美文网首页
[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