【问题标题】:Understanding promises async/await using parseCSV, what am I missing?使用 parseCSV 理解 promises async/await,我错过了什么?
【发布时间】:2021-02-28 22:29:21
【问题描述】:

我觉得我在这里缺少一些基本的东西。我只是想确保“数据”在继续清理/编辑之前保存来自 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;
  });
}

【问题讨论】:

    标签: javascript node.js csv async-await callback


    【解决方案1】:

    因为您没有返回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 })
    }
    

    【讨论】:

    • .then(data => { return data; }) 没有意义。那没有任何作用。而且,.catch(err=>console.log(err));“吃掉”所有错误,因此 parseCSV 永远不会拒绝错误。
    • @jfriend00 是的,我知道我的意思是展示promisify 的东西。不是实际的工作错误处理和东西。我会在几个小时内编辑它。
    猜你喜欢
    • 2017-11-18
    • 2019-01-08
    • 2020-04-12
    • 1970-01-01
    • 2018-02-06
    • 2020-03-25
    • 2016-11-05
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多