【问题标题】:How to make node fs async/await with classes?如何使节点 fs 与类异步/等待?
【发布时间】: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

【问题讨论】:

    标签: node.js asynchronous fs


    【解决方案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. 插入第 3 方原生 fs 替换库,例如 fs-extra

      const fs = require('fs-extra');
      
      let stream;
      try {
        stream = await fs.readFile(csv, buff);
      } catch (err) {
        console.log(err);
      }
      

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 1970-01-01
      • 2023-03-27
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多