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

在Promise中嵌套async函数的写法是否正确?是否属于反模式?

哥们儿,你的实现确实属于没必要的反模式,这里有更简洁的最佳实践

首先得明确一个核心点:async函数本身就会自动返回一个Promise,所以你完全没必要在function B里手动用new Promise去包裹内部的异步逻辑。你当前的写法属于「Promise套Promise」的冗余嵌套,不仅平白增加了代码复杂度,还容易踩坑(比如要是function C里的异常没被正确捕获,外层手动创建的Promise可能会一直卡成pending状态)。

为啥你的写法是反模式?

  • 你在function B里手动new了一个Promise,但内部的function C本身就是async函数,它执行后会自动生成并返回一个Promise。这种嵌套完全是多此一举。
  • 手动管理resolve/reject很容易出错,比如不小心忘了调用resolve,就会导致后续逻辑一直挂着;而async/await会自动帮你处理Promise的状态转换,省心多了。

优化后的正确写法

咱们直接把function B改成async函数就行,它天然就会返回Promise,内部还能直接用await处理异步操作,代码瞬间清爽很多:

const functionA = async () => {
  try {
    await functionB();
    console.log(' ALL DONE ');
  } catch (err) {
    console.error(err);
  }
}

const functionB = async () => {
  const var1 = await make_databaseCall();
  const var2 = await make_different_DatabaseCall();
  
  if (!var2) throw new Error('var2 is invalid!');
  
  const what_I_need = var1 + var2;
  // 要是不需要返回值,这里可以不用写return,async函数会默认返回一个resolved的空Promise
};

额外小 tips

  • 要是function B需要把what_I_need传给function A,只需要在function B里加一句return what_I_need;,然后在function A里用const result = await functionB();就能拿到这个值。
  • 用try/catch包裹await操作,比直接在后面链式加.catch()更符合async/await的代码风格,尤其是当有多个异步操作时,能统一处理所有异常,结构更清晰。

这样改完,既满足了让function A等待function B所有异步操作完成的需求,又完全贴合async/await的最佳实践,再也没有冗余的嵌套逻辑啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:14:12