首页 > 解决方案 > 等到 Filestream 完成

问题描述

我试图弄清楚如何解决这个问题:

我有一个读取 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 功能对我也不起作用,但原因可能是我对这个功能太缺乏经验。

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

亲切的问候,安德烈亚斯

标签: javascriptnode.js

解决方案


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);
                });
        });
    }
}

推荐阅读