You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

疑问: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把异步函数转换成了同步函数!

关键要明白这两点:

  1. async函数本身是异步的:调用asyncCall()时,它不会阻塞整个JS主线程。比如如果在调用后加一行同步代码:
    asyncCall();
    console.log('4');
    
    输出顺序会是1 → 4 → 2 → 3——这说明asyncCall执行到await时,会把控制权交回给主线程,让其他同步代码先执行,完全没有阻塞。
  2. await只是暂停当前async函数的执行:遇到await时,当前的asyncCall函数会暂停,等待Promise完成,但JS引擎不会闲着,会去处理其他任务(比如UI渲染、其他同步代码、其他异步任务)。等Promise resolve后,asyncCall才会从暂停的位置继续执行后续代码。

总结

async/await是异步代码的“同步写法”——它只是让异步逻辑的代码结构看起来像同步代码,极大提升了可读性,避免了回调地狱,但本质上还是基于Promise的异步机制,完全没有改变JS单线程、非阻塞异步的核心特性。

内容的提问来源于stack exchange,提问作者SuicideSheep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:16:42