如何实现func1与func2双向值传递?解决空字符串传递问题
问题分析与解决方案
你的代码存在几个关键问题导致双向值传递失效:
- 异步流程未同步:
func2是异步操作(调用higher_fnc发起请求),但func1调用func2时没有等待其完成,直接执行arr.push(arg2),此时arg2还未被func2回传赋值。 - 变量作用域错误:
arr被声明在for (const x of d.data)循环内部,每次循环都会重新创建空数组,无法累积数据。 - 语法错误:
func1末尾多了一个多余的});,会导致代码无法正常运行。 - 递归调用逻辑混乱:
func2回调func1时传入空字符串作为第一个参数,但func1的核心逻辑依赖arg1发起请求,这会导致后续无意义的请求。
修正后的代码
const higher_fnc = (query_name) => { return axios({ url: GraphQL_Endpoint, method: "post", headers: headers, data: query_name, }); }; // 让func1返回Promise,支持异步等待 const func1 = async (arg1, arg2) => { // 如果arg2有值,说明是func2回传的结果,直接处理 if (arg2) { // 这里可根据需求处理回传的arg2,比如存入数组或做其他业务操作 console.log("func2回传的结果:", arg2); return arg2; } // 初始调用时,arg1不为空,发起请求 const d = await higher_fnc({ query: query1, variables: { id: arg1 }, }); // 将arr声明在循环外部,确保能累积数据 const arr = []; for (const x of d.data) { for (const node of x.nodes) { if (node.id === "56789") { // 等待func2的异步结果返回 const resultFromFunc2 = await func2(node.internalID); // 将func2返回的结果存入数组 arr.push(resultFromFunc2); } } } // 返回处理后的数组,供外部调用者使用 return arr; }; // 让func2返回Promise,方便func1等待结果 const func2 = async (val) => { const d = await higher_fnc({ query: query1, // 若需调用不同GraphQL查询,替换为对应query名 variables: { id: val }, }); // 直接返回处理后的结果,而非递归调用func1 return d.main; };
关键改动说明
- 异步流程同步:使用
async/await替代then链式调用,让func1可以等待func2的异步请求完成,拿到返回结果后再执行后续操作。 - 调整变量作用域:将
arr移到外层循环外部,确保每次循环的结果都能被累积。 - 移除冗余递归:
func2不再回调func1,而是直接返回处理后的结果,由func1主动接收并处理,避免逻辑混乱。 - 区分调用场景:
func1通过判断arg2是否存在,区分是初始调用还是结果回传,逻辑更清晰。
内容的提问来源于stack exchange,提问作者nb_nb_nb
相关产品推荐
相关产品推荐

