首页 > 解决方案 > 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);

标签: javascriptnode.jsasynchronouscsvtojson

解决方案


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

推荐阅读