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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:33:03