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

何时使用Promises与Async/Await?二者性能、可读性及优势解析

嘿,这个问题真的戳中了很多刚摸异步JavaScript开发者的痛点!我当年刚学的时候也纠结了好久,现在给你掰扯清楚~

先给你吃颗定心丸:性能上完全没差异

因为async/await本质就是Promise的语法糖,它并没有创造新的异步机制,只是把Promise的链式调用转换成了更像同步代码的写法。所以不管你用哪种,底层运行的都是Promise那套逻辑,性能上不会有任何区别。

可读性:场景不同各有胜负

这才是你该重点关注的核心:

  • Async/Await 胜在「线性异步流程」:当你需要一步接一步执行依赖型异步操作(比如先拿用户信息,再用用户ID拿订单,最后用订单ID拿详情),async/await写出来的代码和同步代码几乎一模一样,完全不用嵌套then,读起来顺得一批。
    对比一下两种写法:
    Promise链式写法:

    fetchUser()
      .then(user => fetchOrders(user.id))
      .then(orders => fetchOrderDetails(orders[0].id))
      .then(details => console.log(details))
      .catch(err => console.error(err));
    

    Async/Await写法:

    async function getOrderDetails() {
      try {
        const user = await fetchUser();
        const orders = await fetchOrders(user.id);
        const details = await fetchOrderDetails(orders[0].id);
        console.log(details);
      } catch (err) {
        console.error(err);
      }
    }
    getOrderDetails();
    

    后者的执行顺序一目了然,几乎没有学习成本。

  • Promise 链式在「复杂组合操作」中更灵活:比如你需要同时处理多个并行的异步请求,或者在中间步骤对多个异步结果做复杂转换,Promise的all、race、allSettled这些方法配合链式调用,写起来也很清晰。不过其实async/await也能完美配合这些方法,比如await Promise.all([fetchA(), fetchB()]),所以这部分其实是互补关系。

各自的独特优势

  • Promise的不可替代性:它是JavaScript异步编程的基础,所有主流异步API(比如fetch、axios)返回的都是Promise对象。在一些不需要复杂流程的简单异步场景里,直接用.then()处理也很简洁,比如:

    fetch('/api/data').then(res => res.json()).then(data => console.log(data));
    
  • Async/Await的杀手锏:处理带条件判断的异步流程时,它的优势会被无限放大。比如下面这个场景:

    async function getOrderDetails() {
      try {
        const user = await fetchUser();
        if (!user.isActive) {
          console.log("用户未激活,无法获取订单");
          return;
        }
        const orders = await fetchOrders(user.id);
        if (orders.length === 0) {
          console.log("该用户暂无订单");
          return;
        }
        const details = await fetchOrderDetails(orders[0].id);
        console.log(details);
      } catch (err) {
        console.error(err);
      }
    }
    

    如果用Promise链式写这个逻辑,你得在.then()里嵌套判断或者用return中断流程,代码会变得臃肿不堪,可读性直线下降。

什么时候用哪个?

其实不用太纠结,实际开发中混用才是常态:

  • 如果你要处理多步依赖的异步操作,或者有条件判断的异步逻辑,优先用async/await,代码更易读易维护。
  • 如果你只是简单处理单个异步结果,或者需要并行执行多个异步操作,直接用Promise的方法(比如Promise.all)配合await或者.then()都可以,看你个人习惯。
  • 另外,在一些极端老旧环境(比如IE)里async/await不支持,那只能用Promise,但现在这种场景已经几乎绝迹了。

总结一下:二者没有优劣之分,只是写法不同——async/await让Promise的异步代码更贴近同步思维,而Promise是基础,掌握了Promise才能更好地理解async/await。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:24:32