面试笔试题分析之二

     const arr = [500, 100]
        function sleep() {
            return new Promise((resolve => {
                setTimeout(resolve, 100)
            }))
        }
        async function next() {
            console.log(arr.length);
            await sleep();
            const lastItem = arr.pop();
            console.log(lastItem);
        }
        next();
        console.log(8);
        next()
         // 输出 2  8  2  100   500

 原理:async函数中可能会有await表达式,这会使async函数暂停执行,等待表达式中的 Promise 解析完成后继续执行async函数并返回解决结果。

Promise和async中的立即执行

我们知道Promise中的异步体现在then和catch中,所以写在Promise中的代码是被当做同步任务立即执行的。而在async/await中,在出现await出现之前,其中的代码也是立即执行的。

很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,实际上await是一个让出线程的标志。await后面跟着的表达式会先执行一遍,将await下方的代码加入到microtask中,然后就会跳出整个async函数来执行后面的代码。

- async/await 本质上依然是基于Promise,但在使用上更加简便符合自然习惯。
- async函数内部同步执行。await之间相当于.then。
- async函数外部的调用异步执行。
- 需要try/catch await应对promise reject的情况。
————————————————
版权声明:本文为CSDN博主「辰辰沉沉大辰沉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/napoleonxxx/article/details/79360501

 

黑马的这个async/await我看了感觉讲的很清楚

从async/await面试题看宏观任务和微观任务 (itheima.com)

 

所以:先执行next函数,输出arr.length=2,然后碰到await执行sleep进入异步,继续向下执行将后面的代码加入微任务中,clg输出8,再次执行next函数,理解执行arr.length=2,碰到await进入异步,此时同步执行完毕,开始执行异步代码

posted @   铜须的编程生活  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示