javascript - 使用 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;
});
}
解决方案
因为你没有返回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 })
}
推荐阅读
- docker - 当我尝试在 docker 上运行 lttng 时,我找不到踪迹
- elasticsearch - 超过 10k 个文档的 Elasticsearch 聚合是否需要 Scroll API?
- google-cloud-platform - 无法连接到 Google Cloud GCE 上的虚拟机
- python - 是否有可能根据选择在 altair 中重新排序图表?
- javascript - 反应原生的边界半径不起作用
- linux - 如何将 Git 存储库中的所有分支列出到自己的控制台中
- reactjs - Firebase 托管问题:仅上传 2 个文件(在使用 Cloud Function Rewrite 之前,以前是 create-react-app 的 73 个文件)
- sed - Extract text between matched pattern and append text before the result
- reactjs - 在按 Enter 键时在 TextFields 之间切换焦点
- javascript - 一个对象溢出,而另一个对象覆盖 css 反应