首页 > 解决方案 > 使用 parseCSV 理解 promises async/await,我错过了什么?

问题描述

我觉得我在这里缺少一些基本的东西。我只是想确保“数据”在我继续清理/编辑它之前保存来自 parseCSV 的解析数据。

我错过了什么?我从根本上理解 async/await,但我想在回调和 async/await 方面有一些我不明白的地方。

const csv = require("csv");
const fs = require("fs");

(async function start() {
  const file = importCSV("src/tg.csv");
  const data = await parseCSV(file);
  console.log(await parseCSV(file)); // why does this print a parser and not the parsed data?
})();

function importCSV(path) {
  return fs.readFileSync(path, "utf8");
}

async function parseCSV(file) {
  return await csv.parse(file, { columns: true }, async (err, data) => {
    if (err) return err;
    //console.log(data);
    return data;
  });
}

标签: javascriptnode.jscsvasync-awaitcallback

解决方案


因为你没有返回data. 这csv.parse不是一个承诺,所以基本上data是被返回给匿名回调函数的父函数。想想一个使用回调的函数的实现,你是怎么实现的呢?

const a = (cb) => {
    const data = getdatafromsomewhere();
    cb(data);
}

因此,如果您的函数没有专门返回父函数,则不会从任何地方引用返回的数据。

所以最简单的方法是承诺csv.parse

const util = require('util');
const promiseParse = util. promisify(csv.parse);

function parseCSV(file) {
  return promiseParse(file, { columns: true })
}

推荐阅读