面试笔试题分析之二
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进入异步,此时同步执行完毕,开始执行异步代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本