为了账号安全,请及时绑定邮箱和手机立即绑定

NodeJS:异步从循环中的多个 TSV 文件返回数据

NodeJS:异步从循环中的多个 TSV 文件返回数据

慕妹3146593 2024-01-18 16:54:06
我正在尝试将 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 0setTimeout(function() {  console.log(rows.length);}, 2000);                  // prints expected num of rows// do something else with rowsdoSomething(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 promisevar csvData = getRows(rows => {  console.log("Rows in callback: " + rows.length);     // expected length  return rows;}, "myfile.tsv");// do something else with datadoSomething(csvData);
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

答案只是将函数包装在 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);

})();


查看完整回答
反对 回复 2024-01-18
?
森林海

TA贡献2011条经验 获得超2个赞

尝试这个


const csvToJson = require("csvtojson");


const getRows = async (fileName) => {

    const csvData = await csvToJson({

      delimiter: "\t",

      trim: true

    }).fromFile(fileName);

    return csvData;

};


getRows("myfile.tsv").then(data=>{

  console.log(data.length); 

  }

)



查看完整回答
反对 回复 2024-01-18
?
慕容708150

TA贡献1831条经验 获得超4个赞

你可以这样做


const csvToJson = require("csvtojson");


const getRows = async (fileName) => {

  const csvData = await csvToJson({

    delimiter: "\t",

    trim: true

  }).fromFile(fileName);


  const rows = [];

  csvData.forEach((row) => {

    rows.push(row);

  });


  return rows;

};


getRows("myfile.tsv").then((rows) => {

  console.log(rows.length);

});


查看完整回答
反对 回复 2024-01-18
  • 3 回答
  • 0 关注
  • 44 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信