Kevin Zaki
Kevin Zaki

Reputation: 146

Understanding promises async/await using parseCSV, what am I missing?

I feel like I a missing something fundamental here. I simply want to ensure "data" holds the parsed data from parseCSV before I continue to clean/edit it.

What am I missing? I fundamentally understand async / await but I suppose there is something I don't understand when it comes to callbacks and 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;
  });
}

Upvotes: 0

Views: 136

Answers (1)

Aritra Chakraborty
Aritra Chakraborty

Reputation: 12542

Because you are not returning the data. the csv.parse is not a promise so basically the data is being returned to the parent function of the anonymous callback function. Just think of the implementation of a function who uses callback, how do you implement that?

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

so if your function is not specifically returning to the parent function the returned data is not referenced from anywhere.

So the easiest way would be to promisify the csv.parse

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

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

Upvotes: 2

Related Questions