Node.js中如何异步执行批量任务并将返回值写入目标对象?
问题根因
你的问题本质是JavaScript的参数传递规则导致的:
- 函数参数是按值传递,你传入
elementNested.course_assessment时,只是把这个对象的内存地址复制给了函数内的局部变量refObj - 你直接执行
refObj = await result.json(),只是让局部变量refObj指向了接口返回的新对象,完全不会影响外层output数组里的原始对象
解决方案
方案1:修改传入对象的属性而非替换整个对象(改动最小)
不需要修改你现有的循环、Promise.all调用逻辑,仅调整getAssessmentData函数,把接口返回的内容合并到原有对象上即可:
async function getAssessmentData(cookie, params,refObj){ const result = await fetch( `https://www.sampleURL.com?` + new URLSearchParams({ academicYearId: params.academic_year, semesterId: params.semester, courseId: params.course, }), ); const apiData = await result.json(); // 把返回值的所有属性合并到原有对象上,不会替换对象引用 Object.assign(refObj, apiData); }
方案2:直接返回结果赋值(更推荐,逻辑清晰无副作用)
避免引用操作的潜在坑,直接让请求函数返回结果,批量请求完成后统一赋值:
首先调整请求函数:
async function getAssessmentData(cookie, params){ const result = await fetch( `https://www.sampleURL.com?` + new URLSearchParams({ academicYearId: params.academic_year, semesterId: params.semester, courseId: params.course, }), ); return result.json(); }
再调整调用逻辑:
const promiseList = []; const assessmentItemList = []; for (const element of output) { for (const elementNested of element.assessment) { promiseList.push( getAssessmentData(identityCookie, elementNested.course_link_data) ) // 存储对应的assessment项,和promise顺序一一对应 assessmentItemList.push(elementNested) } } const allResults = await Promise.all(promiseList); // 统一赋值更新 allResults.forEach((data, index) => { assessmentItemList[index].course_assessment = data; }) console.log(JSON.stringify(output))
补充说明:50个并发请求用
Promise.all完全可以正常处理,如果目标接口有并发限制,可以额外增加简单的并发控制逻辑,比如每次同时发5-10个请求,跑完再发下一批,避免触发接口限流规则。
内容的提问来源于stack exchange,提问作者m.prime
相关产品推荐
相关产品推荐

