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

如何在互相调用的异步函数全部执行完成后触发回调?

问题修复方案

核心问题梳理

  1. 参数不匹配:func1调用func2时传入单个对象,但func2定义了两个参数,导致内部result无法正确取值。
  2. 未等待异步操作完成:func2中prod_id.map执行createOne(异步函数)时,未等待所有Promise完成,无法感知全部操作结束。
  3. 未触发回调逻辑:未启动func1执行,也未在所有异步流程结束后调用callback。
  4. 变量未定义:func1中的result未声明,应为传入的arg参数。
  5. 语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:25:06