如何使节点 fs 与类异步/等待?
Posted
技术标签:
【中文标题】如何使节点 fs 与类异步/等待?【英文标题】:How to make node fs async/await with classes? 【发布时间】:2018-07-06 22:05:18 【问题描述】:我在制作一个可以异步的解析器时遇到了棘手的问题。我要么得到承诺,要么得到未定义的回报。在网上阅读了一些文档后,我很确定我需要建立一个 try/catch 块,但我不知道 fs.readFile 方法在哪里。任何帮助将不胜感激
const fs = require('fs')
class CSV
constructor (fileName, buffer)
this.fileName = fileName;
this.buffer = buffer;
async parseCSV ()
let csv = this.fileName
let buff = this.buffer
let stream = await fs.readFile(csv, buff, (err, data) =>
if (err) console.log(err)
data = data.split('\r').toString().split('\n')
this.returnData(data)
)
return stream
returnData(data)
return data
let test = new CSV('./topsongs.csv', 'utf8')
let data = await test.parseCSV()
console.log(data)
module.exports = CSV
【问题讨论】:
【参考方案1】:await 运算符用于等待 Promise。它只能在异步函数中使用。 https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Operators/await
fs.readFile
不返回 Promise,您需要一个 Promise 包装器。您可以:
使用内置的util.promisify
手动承诺它。
const fs = require('fs');
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);
let stream;
try
stream = await fs.readFile(csv, buff); // callback omitted, `data` param returned instead
catch (err)
console.log(err);
插入第 3 方原生 fs 替换库,例如 fs-extra。
const fs = require('fs-extra');
let stream;
try
stream = await fs.readFile(csv, buff);
catch (err)
console.log(err);
【讨论】:
以上是关于如何使节点 fs 与类异步/等待?的主要内容,如果未能解决你的问题,请参考以下文章