使用 parseCSV 理解承诺 async/await,我错过了什么?
Understanding promises async/await using parseCSV, what am I missing?
我觉得我在这里缺少一些基本的东西。我只是想确保“数据”在我继续 clean/edit 之前保存来自 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;
});
}
因为您没有返回 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 })
}
我觉得我在这里缺少一些基本的东西。我只是想确保“数据”在我继续 clean/edit 之前保存来自 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;
});
}
因为您没有返回 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 })
}