如何在互相调用的异步函数全部执行完成后触发回调?
问题修复方案
核心问题梳理
- 参数不匹配:func1调用func2时传入单个对象,但func2定义了两个参数,导致内部
result无法正确取值。 - 未等待异步操作完成:func2中
prod_id.map执行createOne(异步函数)时,未等待所有Promise完成,无法感知全部操作结束。 - 未触发回调逻辑:未启动func1执行,也未在所有异步流程结束后调用
callback。 - 变量未定义:func1中的
result未声明,应为传入的arg参数。 - 语法错误:func2中
d. connector多了空格,会导致语法报错。
修正后的代码
const func1 = async (arg) => { // 修正:使用传入的arg参数获取table_id let table_id = arg.data.internal_id; const response = await axios_Func({ /* 填入你的graphQL query */ }); console.log(`${response.data.name} - ${table_id}`); // 保持参数传递一致,传入对象 return func2({ result: arg, table_id }); } // 修正:改为接收单个对象参数,匹配func1的传参 const func2 = async ({ result, table_id }) => { let dev = await getAllTables({ query: tables(123) }); let prod = await getAllTables({ query: tables(321) }); let prod_id = new Set(); result.data.data.table.table_fields.forEach((d) => { // 修正语法错误:去掉connector前的空格 if (d.connector != null && !(d.name in dev)) { prod_id.add(prod[d.name]["id"]); } }); prod_id = [...prod_id]; // 修正:用Promise.all等待所有createOne异步操作完成 await Promise.all(prod_id.map((x) => createOne({ query: graphQL_query(x) }))); }; const callback = () => console.log("all done"); // 启动整个异步流程并触发回调 (async () => { // 这里传入func1需要的初始参数,根据实际场景调整 const initialArg = { data: { internal_id: "示例ID" } }; await func1(initialArg); callback(); })();
关键修改说明
- 统一func1和func2的参数传递格式,避免解构错误。
- 用
Promise.all包裹prod_id.map的结果,确保所有createOne的异步操作都执行完成后,func2才会返回resolved状态的Promise。 - 新增自执行异步函数启动整个流程,通过
await等待所有异步操作链完成后,再调用callback。 - 修复了变量未定义和语法错误,保证代码能正常执行。
内容的提问来源于stack exchange,提问作者nb_nb_nb
相关产品推荐
相关产品推荐

