我有一个棘手的时间制作一个可以异步的解析器。我要么得到一个承诺返回或得到未定义返回。在网上阅读了一些文档后,我非常确定我需要建立一个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
答案 0 :(得分: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);
}
插入第三方原生fs替换库,例如fs-extra。
const fs = require('fs-extra');
let stream;
try {
stream = await fs.readFile(csv, buff);
} catch (err) {
console.log(err);
}
答案 1 :(得分:0)
对于给出的答案,只是一个小而重要的编辑..在情景1中你会像我在下面那样在没有前面的fs的情况下调用readFile ..道歉我只会评论而不是做另一个答案但是我没有'有足够的代表评论。
fs.readFile没有返回Promise,你需要一个Promise包装器。你可以:
使用内置的util.promisify手动进行Promisify。
const fs = require('fs');
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);
let stream;
try {
stream = await readFile(csv, buff); // callback omitted, `data` param returned instead
} catch (err) {
console.log(err);
}
投入第三方原生fs替换库,如fs-extra。
const fs = require('fs-extra');
let stream;
try {
stream = await fs.readFile(csv, buff);
} catch (err) {
console.log(err);
}