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

循环调用API获取的数据无法通过writeFileSync写入JSON文件

问题根因

代码执行后写入空数组,由两个核心错误导致:

  • 异步时序逻辑错误:fetch属于异步非阻塞操作,for循环发起100个接口请求后不会等待响应返回,会直接执行后续的fs.writeFileSync逻辑。此时resultJson还是初始化的空数组,写入文件的内容自然就是[]。等后续接口响应陆续返回时,文件写入操作早就执行完毕了。
  • 数组赋值逻辑错误:请求成功的回调中写的resultJson = res是直接将整个数组变量替换为单个接口的返回对象,就算修复时序问题等待所有请求完成,最终也只会保留最后一个接口的返回结果,无法收集全部100条数据。

另外原代码for循环中用var声明迭代变量i存在变量提升隐患,容易导致请求参数错误,建议替换为let声明块级作用域变量。

修复方案

核心修复思路是:等所有接口请求都完成、全部结果收集到数组之后,再执行文件写入操作,同时修正数组的赋值逻辑,将单个接口结果追加到数组而非覆盖整个数组变量。根据接口的并发限制要求,可以选择两种实现方式:

并行请求实现(执行速度快,适合无严格并发限制的场景)

用Promise.all统一收集所有请求任务,等待所有请求全部返回后再一次性写入文件:

async function processRarity(limit) {
  const resultJson = [];
  const requestTaskList = [];
  // 批量生成请求任务
  for (let i = limit; i < limit + 100; i++) {
    const task = fetch(`https://api-v2-mainnet.paras.id/token/asac.near::${i}`)
      .then(res => res.json());
    requestTaskList.push(task);
  }
  // 等待所有请求完成,收集全部结果
  const allResponse = await Promise.all(requestTaskList);
  resultJson.push(...allResponse);
  // 所有数据收集完成后再写入文件
  fs.writeFileSync(`${basePath}/results.json`, JSON.stringify(resultJson, null, 2));
}

// 调用函数时记得捕获异步错误
processRarity(/* 传入你的limit参数 */).catch(err => console.error('任务执行失败:', err));

串行请求实现(请求间隔执行,适合有并发数限制的场景)

如果接口不支持短时间内100个并发请求,可以在for循环内依次等待每个请求返回,将结果逐个追加到数组,全部完成后再写入文件:

async function processRarity(limit) {
  const resultJson = [];
  for (let i = limit; i < limit + 100; i++) {
    const response = await fetch(`https://api-v2-mainnet.paras.id/token/asac.near::${i}`);
    const jsonData = await response.json();
    console.log(jsonData);
    // 逐个将结果追加到数组,不要直接覆盖整个数组变量
    resultJson.push(jsonData);
  }
  fs.writeFileSync(`${basePath}/results.json`, JSON.stringify(resultJson, null, 2));
}

processRarity(/* 传入你的limit参数 */).catch(err => console.error('任务执行失败:', err));

内容的提问来源于stack exchange,提问作者mb-1208

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:24:22