如何使节点fs async / await与类?

时间:2018-01-27 20:53:34

标签: node.js asynchronous fs

我有一个棘手的时间制作一个可以异步的解析器。我要么得到一个承诺返回或得到未定义返回。在网上阅读了一些文档后,我非常确定我需要建立一个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

2 个答案:

答案 0 :(得分:1)

  

await运算符用于等待Promise。它只能在异步函数中使用。   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

fs.readFile没有返回Promise,你需要一个Promise包装器。你可以:

  1. 使用内置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);
    }
    
  2. 插入第三方原生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);
}