javascript - Nodejs拆分大数组并进行多个API调用
问题描述
我有一个 CSV 文件,其中包含 21k 条记录(1 字字母数字类型/行)。我需要读取这些记录并将它们发送到 JSON 键值对格式的 API,以进行一次只接受 500 个元素的处理。我有一个解决方案,但我想知道是否有更好或更有效的解决方案/算法?
算法:
- 将 CSV 加载到数组中
- 将此一维数组拆分为 N 数组,固定长度为 500 列(元素)
- 使用这 N 个 500 元素数组中的每一个,准备 JSON 有效负载并发送到 API。
代码:
var dataArray = [];
fs.readFile(inputPath, 'utf8', function (err, data) {
dataArray = data.split(/\r?\n/);
})
var temp = [];
for(i=0;i<dataArray.length;){
temp=[];
for(j=0;(j<500 && i<dataArray.length);j++){
temp.push(data[i]);
i++;
}
// make API call with current values of temp array
makeCallToAPI(temp);
}
解决方案
我会使用 lodash 或下划线_.chunk()。另请注意,fs 和 API 都可以更好地处理异步。
const _ = require('lodash');
async function callApi(chunk) {
// return a promise that resolves with the result of the api
}
async function readFS(inputPath) {
return new Promise((resolve, reject) => {
fs.readFile(inputPath, 'utf8', function (err, data) {
if (err) reject(err);
else resolve(data.split(/\r?\n/));
});
});
}
async function doTheWork(inputPath) {
const data = await readFS(inputPath);
const chunks = _.chunk(data, 500)
const promises = chunks.map(callApi)
return _.flatten(Promise.all(promises));
}
还要注意_.flatten()的使用,因为最后一个 Promise.all() 将解析为一组由承诺块组成的数组。
推荐阅读
- c++ - stl::map 中运算符 [] 的奇怪行为
- python - 通过用逗号分隔将项目列表写入 Excel 工作表
- r - 错误“需要数字/复数矩阵/向量参数”,即使参数是矩阵
- git - 优化使用 Git 来管理与公共源和存储库相关的项目
- python - 在一个单词之后编辑一行文本文件
- groovy - 使用while(soapui groovyscript)在groovy计数器中返回`null`
- ios - 我如何检查 Alamofire 我的请求已发送?
- amazon-web-services - AWS Cognito 在发布模式下不起作用,异常:“AmazonCognitoIdentityProviderConfig 的类型初始化程序”
- python - 将字典中的值替换为多索引数据框
- android - ndk 构建期间无法构建静态库