csv-parser .on('end ')nodeJS

eimct9ow  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

我有一个函数bd(),它应该返回一个数组,其中包含在文件groupes.csv中读取的所有数据,这些数据将在以后进行处理:

function bd() {
const birthdays = [];  
    fs.createReadStream('./data/groupes.csv')
            .pipe(csv({}))
            .on('data', (data) => birthdays.push(data))
            .on('end', () => {
              console.log(birthdays)
          });
}

控制台确实显示了生日数组,我的问题是返回它。
我希望这个函数返回birthdays数组。我没有成功。
当我把return语句放在.on('end ')块内时,它不起作用(出于某种原因)[也许return语句应该在fs.read之外],如果我这样做(把它放在.on('end')块之后),即使在等待它完成while循环之后,数组似乎也是空的。

oipij1gg

oipij1gg1#

我链接了旧的帖子,但你似乎没有理解代码的潜在问题。
.on()函数用于告诉程序在调用evet时调用它内部的函数**,在本例中是end**,那么我们如何将其应用于您编写的代码?
.on('end', () => {});中的函数在完成阅读后立即被调用,因此当调用此回调函数时,birthdays数组将被填充。
这将导致代码能够继续运行,即使流尚未完成,并且当它将打印您的生日数组到控制台时,生日数组尚未开始填充。

**那么,我们如何解决这个问题?**简单:我们使用所谓的承诺。

承诺就是你所想的。这是一个承诺,这个函数将返回一些东西 * 稍后 *,并承诺在数据可用时给予该数据。
下面是一个使用promise时函数的外观示例:

function bd() {
    return new Promise((resolve, reject) => {
        const birthdays = [];
        fs.createRedStream('./data/groupes.csv')
            .pipe(csv({}))
            .on('data', (data) => birthdays.push(data))
            .on('end', () => {
                resolve(birthdays);
            });
    });
}

这里到底发生了什么
我们创建了一个新的promise对象,并向其中传递了一个新的回调参数,该参数包含我们函数的原始代码以及从回调中获取的2个参数。这两个函数是我们用来处理错误(.catch())和实现我们的承诺,我们作出返回数据或我们的 resolve 函数。
这个resolve函数基本上是我们用来代替return的。
那么我们如何在代码后面使用promise呢?
我们使用.then()函数,每当promise被解析时都会调用它。

bd().then((birthdays) => {
    /* Code */
});

如果你不理解Promise如何工作的核心概念,那么我可以向你保证(双关语),js可能会成为你的问题。我建议您不要只使用提供的代码,而是尝试了解它是如何工作的。
你可以阅读更多关于promise如何在MDN上工作的信息。

r8xiu3jd

r8xiu3jd2#

@KibbeWater的建议如果对你不起作用,那就是正确的
add .end(csvData);在函数结束时
应该是这样的

function bd() {
    const birthdays = [];  
        fs.createReadStream('./data/groupes.csv')
                .pipe(csv({}))
                .on('data', (data) => birthdays.push(data))
                .on('end', () => {
                  console.log(birthdays)
              });
              .end(THE_FILE_YOU'RE_TARGETTING);
    }

希望这对你有帮助!

相关问题