【问题标题】:Wait until Filestream has finished等到 Filestream 完成
【发布时间】:2021-07-16 04:05:12
【问题描述】:

我正在想办法解决这个问题:

我有一个函数可以读取 csv,将其保存到数组中,然后返回数组。我的问题:在我尝试返回数组之前,它总是返回一个空数组,因为文件流尚未完成。

const parser = require("csv-parser");
const fs = require("fs");

class CsvConverter {

    constructor() {}

    convert(filePath) {
        console.log(this.getRawCsv(filePath));
        [...]
    }

    getRawCsv(filePath) {
        const results = [];
        fs.createReadStream(filePath)
            .pipe(parser())
            .on("data", (data) => results.push(data));
//          .on("end", () => {});
        return results;
    }
    [...]
}

module.exports = CsvConverter;

我已经尝试使用.on("end", () => {}); 回调,但我找不到在回调函数中返回结果数组的方法。

使用 Promises 和 async/await 功能对我也不起作用,但原因可能是我对这个功能太缺乏经验。

感谢您的帮助和可能的解决方案:)

亲切的问候, 安德烈亚斯

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    convert 函数在 getRawCsv 函数之前完成,因为createFileStream 是异步的。您可以将流包装成一个承诺,然后等待它完成。我把你的例子缩写了一点。

    const {createReadStream} = require('fs');
    
    class CsvConverter {
    
        constructor() {}
    
        async convert(filePath) {
            const raw = await this.getRawCsv(filePath)
            console.log(raw)
        }
    
        getRawCsv(filePath) {
            const results = [];
            return new Promise((resolve, reject) => {
                createReadStream(filePath, {encoding: 'utf8'})
                    .on('data', data => {
                        results.push(data)
                    })
                    .on('end', () => {
                        resolve(results);
                    })
                    .on('error', (err) => {
                        reject(err);
                    });
            });
        }
    }
    

    【讨论】:

    • 嘿托德,非常感谢您的帮助!我必须在未来更多地进入 Promises 和类似的东西,以了解它的全部功能;)
    • @Andreas 你会接受还是投票赞成这个答案?
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2011-12-17
    • 2011-01-29
    • 2021-08-09
    相关资源
    最近更新 更多