疑问:Async/Await是否会将Asynchronous函数转为synchronous函数?
嘿,这个问题问得特别好——很多刚接触async/await的开发者都会有这个错觉!咱们一步步拆解清楚:
先回顾你提到的同步与回调式异步
首先是同步代码:
以下是同步代码示例:
console.log('1') console.log('2') console.log('3')这段代码会稳定输出“1 2 3”,因为JS引擎会按顺序逐行执行,每一行必须等上一行完成才会继续。
然后是回调式的异步代码:
异步请求会等待计时器完成或请求响应,同时其余代码继续执行。时机合适时,回调函数会触发这些异步请求执行。
console.log('1') setTimeout(function afterTwoSeconds() { console.log('2') }, 2000) console.log('3') // 输出顺序:1 3 2
这里的setTimeout是异步任务,JS引擎会把它放到后台任务队列,先执行完同步的console.log('1')和console.log('3'),等2秒计时器结束后,才会把回调函数拿到主线程执行,所以输出顺序是1→3→2。
关于async/await的核心误解
你给出的async/await代码示例:
function resolveAfter2Seconds() { return new Promise(resolve => { setTimeout(() => { resolve('2'); }, 2000); }); } async function asyncCall() { console.log('1'); var result = await resolveAfter2Seconds(); console.log(result); console.log('3'); } asyncCall();
看起来输出顺序是1→2→3,和同步代码一样,但这并不代表async/await把异步函数转换成了同步函数!
关键要明白这两点:
- async函数本身是异步的:调用
asyncCall()时,它不会阻塞整个JS主线程。比如如果在调用后加一行同步代码:
输出顺序会是asyncCall(); console.log('4');1 → 4 → 2 → 3——这说明asyncCall执行到await时,会把控制权交回给主线程,让其他同步代码先执行,完全没有阻塞。 - await只是暂停当前async函数的执行:遇到
await时,当前的asyncCall函数会暂停,等待Promise完成,但JS引擎不会闲着,会去处理其他任务(比如UI渲染、其他同步代码、其他异步任务)。等Promise resolve后,asyncCall才会从暂停的位置继续执行后续代码。
总结
async/await是异步代码的“同步写法”——它只是让异步逻辑的代码结构看起来像同步代码,极大提升了可读性,避免了回调地狱,但本质上还是基于Promise的异步机制,完全没有改变JS单线程、非阻塞异步的核心特性。
内容的提问来源于stack exchange,提问作者SuicideSheep
相关产品推荐
相关产品推荐

