如何使节点 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 与类异步/等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何在节点 js 中正确使用等待/异步与 for 循环

ForEach 循环中的异步/等待节点 Postgres 查询

带有异步等待的节点 repl

具有完整路径的节点异步 mkdir

如何等待多个 fs.readFile 调用?

通过节点的异步/等待不需要按预期顺序返回结果 - 使用啥正确模式?