我有一个函数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循环之后,数组似乎也是空的。
2条答案
按热度按时间oipij1gg1#
我链接了旧的帖子,但你似乎没有理解代码的潜在问题。
.on()函数用于告诉程序在调用evet时调用它内部的函数**,在本例中是end**,那么我们如何将其应用于您编写的代码?
.on('end', () => {});
中的函数在完成阅读后立即被调用,因此当调用此回调函数时,birthdays数组将被填充。这将导致代码能够继续运行,即使流尚未完成,并且当它将打印您的生日数组到控制台时,生日数组尚未开始填充。
**那么,我们如何解决这个问题?**简单:我们使用所谓的承诺。
承诺就是你所想的。这是一个承诺,这个函数将返回一些东西 * 稍后 *,并承诺在数据可用时给予该数据。
下面是一个使用promise时函数的外观示例:
这里到底发生了什么
我们创建了一个新的promise对象,并向其中传递了一个新的回调参数,该参数包含我们函数的原始代码以及从回调中获取的2个参数。这两个函数是我们用来处理错误(
.catch()
)和实现我们的承诺,我们作出返回数据或我们的 resolve 函数。这个resolve函数基本上是我们用来代替return的。
那么我们如何在代码后面使用promise呢?
我们使用.then()函数,每当promise被解析时都会调用它。
如果你不理解Promise如何工作的核心概念,那么我可以向你保证(双关语),js可能会成为你的问题。我建议您不要只使用提供的代码,而是尝试了解它是如何工作的。
你可以阅读更多关于promise如何在MDN上工作的信息。
r8xiu3jd2#
@KibbeWater的建议如果对你不起作用,那就是正确的
add .end(csvData);在函数结束时
应该是这样的
希望这对你有帮助!