如何让一个async异步函数等待另一个异步函数执行完成
错误原因
- 两段异步逻辑没有建立依赖关系,两个Promise在代码执行时会同步发起,完全不存在「等ID拉完再查城镇」的等待逻辑
- 调用
getTownsByIdsAsync时没有传入任何参数,实际传给getTown接口的是undefined,接口找不到对应资源直接返回Not found - 代码存在多余的Promise包装:async函数本身返回Promise,额外套
new Promise属于反模式,还出现了反复重写Promise变量值的不规范写法 - 预留的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
相关产品推荐
相关产品推荐

