我正在node.js服务器上创建一个读取CSV文件的函数,我需要读取所有行并针对每个行(更新或插入,然后设置一个指定的列,以标识此项目为“在此执行中已修改”),完成此操作后,在未更新或未插入的项目上更改另一列,以将该项目标识为“已删除”]
起初,我遇到的问题是,此CSV具有数百万行(字面意义)和一百列,因此我很容易用完内存,并且此行数会增加或减少,所以我不知道数量我每次接收时都必须处理的行数。
我制作了一个简单的程序,使我可以用可读的行数将CSV分隔为其他一些CSV文件,这样我的服务器就可以处理其中的每一个而不会死,因此每个新文件的处理量都未知,因此现在我有一个不同的问题。
我想读取所有这些CSV文件,进行那些操作,完成这些操作后,执行最后一个操作将更改那些未更新/插入的内容。唯一的问题是我需要阅读所有这些信息,而我却不能同时做到这一点,无论它们有多少,我都必须按顺序进行(如前所述,在分离主CSV之后,我可能将100万行划分为3个文件,或2百万个文件转换为6个文件)。
起初我虽然使用forEach循环,但是问题是,foreach不遵守承诺,因此它将启动所有循环,加载所有这些CSV时服务器将耗尽内存,然后死亡。老实说,在foreach的每次迭代上使用while(boolean)等待每个函数的解析似乎很...。对我来说,这很臭,而且我觉得该解决方案会使服务器无法正常工作,所以我寻找不同的解决方案。
让我为您简要介绍我想要的内容:
const arrayReader=(([arrayOfCSVs])=>{
initialFunction();
functions(arrayOfCSVs[0])
.then((result)=>{
functions(arrayOfCSVs[1])
.then((result2)=>{
functions(arrayOfCSVs[2])
(OnAndOnAndOnAndOn...)
.then((resultX)=>{
executeFinalFunction();
});
});
});
您可以使用Array.reduce
来获得先前的承诺并排队新的承诺,而无需等待。
const arrayReader = ([arrayOfCSVs]) => {
initialFunction();
return arrayOfCSVs.reduce((prom, csv) => {
return prom.then(() => functions(csv));
}, Promise.resolve()).then(resultX => executeFinalFunction());
}