循环调用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
相关产品推荐
相关产品推荐

