javascript - NodeJS:从循环中的多个TSV文件异步返回数据
问题描述
我正在尝试将 TSV 数据读取到数组中,并且此async
函数可以很好地加载行,但是rows.push(row)
当我尝试获取函数之外的行时,仍然会延迟。
有没有办法让我在这个函数之外使用行数据?我已经尝试过承诺,但似乎它们仍然需要在异步函数中。
我正在遍历多个文件并读取每个文件的数据,我需要等到所有数据都加载完毕才能继续,所以我认为将其他所有内容包装在回调中是没有意义的......
const csvToJson = require("csvtojson");
var rows = [];
const getRows = async (fileName) => {
const csvData = await csvToJson({
delimiter: "\t",
trim: true
}).fromFile(fileName);
csvData.forEach((row) => {
rows.push(row);
});
return rows;
};
getRows("myfile.tsv");
console.log(rows.length); // prints 0
setTimeout(function() {
console.log(rows.length);
}, 2000); // prints expected num of rows
// do something else with rows
doSomething(rows);
或者,使用回调,但我得到一个未决的承诺作为回报。我知道我可以用 解决它then
,但这对我以外的我没有帮助then
。
const getRows = async (callback, fileName) => {
const csvData = await csvToJson({
delimiter: "\t",
trim: true
}).fromFile(fileName);
let rows = [];
csvData.forEach((row) => {
rows.push(row);
});
return callback(rows);
};
// returns a pending promise
var csvData = getRows(rows => {
console.log("Rows in callback: " + rows.length); // expected length
return rows;
}, "myfile.tsv");
// do something else with data
doSomething(csvData);
解决方案
答案只是将函数包装在 async 中并使用await
. 我想你不能在外面得到这些数据async
async function getTableDetails(paths, rowStart = 2) {
let tables = {};
for (var i = 0; i < paths.length; i++) {
let p = paths[i];
const getRows = async (fileName) => {
const csvData = await csvToJson({
delimiter: "\t",
trim: true
}).fromFile(fileName);
return csvData;
};
let rows = await getRows(p);
tables[p] = { rows: rows };
}
return tables;
}
(async function test() {
let tableDetails = await getTableDetails(fps, rowStart=2);
console.log(Object.keys(tableDetails));
doSomething(tableDetails);
})();
推荐阅读
- ruby-on-rails - Select2 Css 未通过纱线或资产预编译加载
- c# - C#:使用命令行和 C# 代码的相同命令不起作用
- python-3.x - Pycharm未解决的参考突出显示
- kubernetes - 移除 GCP Kubernetes 的默认 CPU 请求和限制
- jmeter - WSO2 API Gateway中API的JMeter负载测试
- html - 将 flex-box 列中的项目与中间项目对齐
- python - 如何使用python在csv文件中逐行读取一列数据
- php - Eloquent 的 belongsToMany 关系与非标准的列名
- php - 如果它们都以相同的字母开头,如何将一个数组值匹配并替换为另一个数组键?
- javascript - observable 中的错误,尝试使用 get 方法