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);


慕妹3146593
浏览 57回答 3
3回答

缥缈止盈

答案只是将函数包装在 async 中并使用await. 我猜你无法在async🤔之外获取此数据async function getTableDetails(paths, rowStart = 2) {&nbsp; let tables = {};&nbsp; for (var i = 0; i < paths.length; i++) {&nbsp; &nbsp; let p = paths[i];&nbsp; &nbsp; const getRows = async (fileName) => {&nbsp; &nbsp; &nbsp; &nbsp; const csvData = await csvToJson({&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delimiter: "\t",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trim: true&nbsp; &nbsp; &nbsp; &nbsp; }).fromFile(fileName);&nbsp; &nbsp; &nbsp; &nbsp; return csvData;&nbsp; &nbsp; };&nbsp; &nbsp; let rows = await getRows(p);&nbsp; &nbsp; tables[p] = { rows: rows };&nbsp; }&nbsp; return tables;}(async function test() {&nbsp; let tableDetails = await getTableDetails(fps, rowStart=2);&nbsp; console.log(Object.keys(tableDetails));&nbsp; doSomething(tableDetails);})();

森林海

尝试这个const csvToJson = require("csvtojson");const getRows = async (fileName) => {&nbsp; &nbsp; const csvData = await csvToJson({&nbsp; &nbsp; &nbsp; delimiter: "\t",&nbsp; &nbsp; &nbsp; trim: true&nbsp; &nbsp; }).fromFile(fileName);&nbsp; &nbsp; return csvData;};getRows("myfile.tsv").then(data=>{&nbsp; console.log(data.length);&nbsp;&nbsp; })

慕容708150

你可以这样做const csvToJson = require("csvtojson");const getRows = async (fileName) => {&nbsp; const csvData = await csvToJson({&nbsp; &nbsp; delimiter: "\t",&nbsp; &nbsp; trim: true&nbsp; }).fromFile(fileName);&nbsp; const rows = [];&nbsp; csvData.forEach((row) => {&nbsp; &nbsp; rows.push(row);&nbsp; });&nbsp; return rows;};getRows("myfile.tsv").then((rows) => {&nbsp; console.log(rows.length);});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript