csv-解析器.on('end') nodeJS

csv-parser .on('end') nodeJS

我有这个函数 bd() 应该 return 文件中读取的所有数据的数组 groupes.csv 稍后将对其进行处理 :

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

控制台确实显示生日数组,我的问题是return它。

我想要这个函数 return 生日数组。我还没有成功。

当我将 return 语句放在 .on('end') 块中时,它不起作用(出于某种原因)[也许 return 语句应该在fs.read] 如果我这样做(将其放在 .on('end') 块之后),即使在使用 while 循环等待它完成后,数组似乎还是空的。

我链接了旧的 post,但您似乎没有理解代码的根本问题。

.on()函数是用来告诉程序调用其中的函数当事件被调用时,在本例中是结束,那么我们如何应用这是你写的代码?

您的 .on('end', () => {}); 中的函数在完成读取后立即被调用,因此当此回调被调用时您的生日数组将被填充。

这将导致代码能够继续 运行 即使流尚未完成,并且在它将您的生日数组打印到控制台时,生日数组尚未完成开始有人居住。

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

承诺就是你所想的那样。 这是一个承诺,此功能将 return 稍后 一些东西 并承诺在可用时提供该数据。

下面是使用 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()) 和实现我们对 return 数据或我们的 resolve 函数做出的承诺。

这个resolve函数基本上就是我们用来代替return的。

那么我们稍后如何在代码中使用 promise?

我们使用 .then() 函数,只要承诺得到解决,该函数就会被调用。

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

如果您不了解 Promise 工作原理的核心概念,那么我可以向您保证(双关语)js 可能会成为您的问题。我建议您不要只接受提供的代码,而是尝试了解它是如何工作的。

您可以阅读更多关于承诺如何在 MDN

上运作的信息