Javascript 用于按顺序执行承诺函数的长度未知的数组
我正在node.js服务器上创建一个函数,它读取一个CSV文件,我需要读取所有行并为每个行执行几个承诺的操作(Mysql查询)(更新或插入,然后设置一个指定列,该列将该项标识为“在执行中修改”)完成后,在未更新或插入的项目上更改另一列,以将这些项目标识为“已删除” 起初,我遇到的问题是,这个CSV有数百万行(字面上)和100列,因此我很容易耗尽内存,而且行数可能会增加或减少,因此我无法知道每次收到它时必须处理的行数 我制作了一个简单的程序,允许我用可读的行数将这个CSV与其他CSV分开,这样我的服务器就可以在不死掉的情况下处理每个CSV,从而使每个新文件处理的文件数量未知,所以现在我有了一个不同的问题 我想读取所有这些CSV,进行这些操作,一旦这些操作完成,执行最后一个,它将更改那些未更新/插入的CSV。唯一的问题是,我需要阅读所有这些内容,而我不能同时阅读,我必须按顺序阅读,无论它们有多少(如前所述,分离主CSV后,我可能会将100万行分为3个文件,或将200万行分为6个文件) 起初我想使用forEach循环,但问题是,forEach不尊重承诺,所以它会启动所有这些循环,服务器在加载所有CSV时会耗尽内存,然后死机。老实说,在foreach的每次迭代中使用while(boolean)来等待每个promisified函数的解析似乎很不错。。。。对我来说很难闻,而且我觉得这个解决方案会阻止服务器正常工作,所以我正在寻找一个不同的解决方案 让我快速解释一下我想要什么:Javascript 用于按顺序执行承诺函数的长度未知的数组,javascript,arrays,node.js,es6-promise,Javascript,Arrays,Node.js,Es6 Promise,我正在node.js服务器上创建一个函数,它读取一个CSV文件,我需要读取所有行并为每个行执行几个承诺的操作(Mysql查询)(更新或插入,然后设置一个指定列,该列将该项标识为“在执行中修改”)完成后,在未更新或插入的项目上更改另一列,以将这些项目标识为“已删除” 起初,我遇到的问题是,这个CSV有数百万行(字面上)和100列,因此我很容易耗尽内存,而且行数可能会增加或减少,因此我无法知道每次收到它时必须处理的行数 我制作了一个简单的程序,允许我用可读的行数将这个CSV与其他CSV分开,这样我的
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());
}
不幸的是,这似乎与使用foreach创建承诺函数数组的方式相同,然后使用promise.all,它几乎同时启动所有承诺,因此,我无法将它们排队。使用该算法,我一开始就有以下控制台日志:开始处理csv文件从csv文件开始查询Csv1.csv从csv文件开始查询Csv2.csv从csv文件开始查询Csv3.csv从csv文件完成处理所有csv文件完成更新后/更新200 445.656 ms-40插入完成插入可能是您的函数
functions
未返回承诺。我给出的代码将数组转换为这种格式functions(arr[0])。然后(()=>functions(arr[1])。然后(…)
函数functions
正确地返回了一个承诺,这是我的错,因为我过多地编辑了你给我的代码。非常感谢,因为它工作完美,而且TBH从未以这种方式使用过reduce函数。向上投票!