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

如何让一个async异步函数等待另一个异步函数执行完成

错误原因
  1. 两段异步逻辑没有建立依赖关系,两个Promise在代码执行时会同步发起,完全不存在「等ID拉完再查城镇」的等待逻辑
  2. 调用getTownsByIdsAsync时没有传入任何参数,实际传给getTown接口的是undefined,接口找不到对应资源直接返回Not found
  3. 代码存在多余的Promise包装:async函数本身返回Promise,额外套new Promise属于反模式,还出现了反复重写Promise变量值的不规范写法
  4. 预留的for循环没有任何实际逻辑,没有处理ID列表到城镇请求的参数传递
正确实现

直接用async/await组织串行逻辑即可,不需要手动嵌套Promise,代码可读性和时序可靠性更高:

import { getTown, getTownIds } from "./api/towns" 

const getTownIdsAsync = async () => {
  const idRes = await getTownIds()
  return idRes.ids
}

const getTownsByIdsAsync = async (idList) => {
  // 如果getTown支持批量传ID数组查询,直接return await getTown(idList)即可
  // 如果getTown单次仅支持查询1个ID,用Promise.all并发拉取所有数据
  return Promise.all(idList.map(singleId => getTown(singleId)))
}

// 主流程按顺序执行
const fetchAllTowns = async () => {
  try {
    // 等待ID列表拉取完成
    const townIds = await getTownIdsAsync()
    // 传入ID列表,等待城镇数据拉取完成
    const townData = await getTownsByIdsAsync(townIds)
    console.log('城镇数据拉取成功:', townData)
    return townData
  } catch (err) {
    console.log('请求异常:', err)
  }
}

fetchAllTowns()

补充:如果你的业务场景不需要并发请求,要按顺序逐个拉取城镇数据,把Promise.all换成for循环串行await即可,不过批量场景下并发请求性能更好。

内容的提问来源于stack exchange,提问作者Tomáš Gabriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:24:19