用于按顺序执行承诺功能的未知长度数组
Unknown length array used to execute promised functions sequentially
我正在 node.js 服务器上创建一个读取 CSV 文件的函数,我需要读取所有行并为每个行执行几个承诺的操作(MySQL 查询)(更新或插入,然后设置一个指定的列,将此项目标识为“在此执行中修改”),一旦完成,更改未更新或插入的另一列以将此项目标识为“已删除”
起初,我遇到的问题是这个 CSV 有数百万行(字面意思)和一百列,所以我 运行 很容易内存不足,而且这个行数可能会增加或减少,所以我不知道每次收到它时我必须处理的行数。
我制作了一个简单的程序,允许我用可读的行数将这个 CSV 文件与其他一些文件分开,这样我的服务器就可以在不死机的情况下处理每个文件,从而使每个新文件的文件数量未知已处理,所以现在我遇到了不同的问题。
我想读取所有这些 CSV,进行这些操作,并在这些操作完成后执行最后一个操作,这将更改那些未更改的 updated/inserted。唯一的问题是我需要阅读所有这些内容并且我不能同时这样做,我必须按顺序进行,无论它们有多少(如前所述,在分离主要 CSV 之后,我可能有 100 万行分为3 个文件,或 200 万分为 6 个文件)。
起初我想使用 forEach 循环,但问题是,foreach 不尊重承诺,所以它会启动所有这些,服务器会 运行 在加载所有时内存不足那些 CSV 然后死掉。老实说,在 foreach 的每次迭代中使用 while(boolean) 来等待每个 promisified 函数的解析看起来很漂亮......对我来说很臭,而且我觉得这个解决方案会阻止服务器正常工作所以我正在寻找不同的解决方案。
让我快速解释一下我想要什么:
const arrayReader=(([arrayOfCSVs])=>{
initialFunction();
functions(arrayOfCSVs[0])
.then((result)=>{
functions(arrayOfCSVs[1])
.then((result2)=>{
functions(arrayOfCSVs[2])
(OnAndOnAndOnAndOn...)
.then((resultX)=>{
executeFinalFunction();
});
});
});
您可以使用Array.reduce
获取之前的promise并排队新的promise,无需等待。
const arrayReader = ([arrayOfCSVs]) => {
initialFunction();
return arrayOfCSVs.reduce((prom, csv) => {
return prom.then(() => functions(csv));
}, Promise.resolve()).then(resultX => executeFinalFunction());
}
我正在 node.js 服务器上创建一个读取 CSV 文件的函数,我需要读取所有行并为每个行执行几个承诺的操作(MySQL 查询)(更新或插入,然后设置一个指定的列,将此项目标识为“在此执行中修改”),一旦完成,更改未更新或插入的另一列以将此项目标识为“已删除”
起初,我遇到的问题是这个 CSV 有数百万行(字面意思)和一百列,所以我 运行 很容易内存不足,而且这个行数可能会增加或减少,所以我不知道每次收到它时我必须处理的行数。
我制作了一个简单的程序,允许我用可读的行数将这个 CSV 文件与其他一些文件分开,这样我的服务器就可以在不死机的情况下处理每个文件,从而使每个新文件的文件数量未知已处理,所以现在我遇到了不同的问题。
我想读取所有这些 CSV,进行这些操作,并在这些操作完成后执行最后一个操作,这将更改那些未更改的 updated/inserted。唯一的问题是我需要阅读所有这些内容并且我不能同时这样做,我必须按顺序进行,无论它们有多少(如前所述,在分离主要 CSV 之后,我可能有 100 万行分为3 个文件,或 200 万分为 6 个文件)。
起初我想使用 forEach 循环,但问题是,foreach 不尊重承诺,所以它会启动所有这些,服务器会 运行 在加载所有时内存不足那些 CSV 然后死掉。老实说,在 foreach 的每次迭代中使用 while(boolean) 来等待每个 promisified 函数的解析看起来很漂亮......对我来说很臭,而且我觉得这个解决方案会阻止服务器正常工作所以我正在寻找不同的解决方案。
让我快速解释一下我想要什么:
const arrayReader=(([arrayOfCSVs])=>{
initialFunction();
functions(arrayOfCSVs[0])
.then((result)=>{
functions(arrayOfCSVs[1])
.then((result2)=>{
functions(arrayOfCSVs[2])
(OnAndOnAndOnAndOn...)
.then((resultX)=>{
executeFinalFunction();
});
});
});
您可以使用Array.reduce
获取之前的promise并排队新的promise,无需等待。
const arrayReader = ([arrayOfCSVs]) => {
initialFunction();
return arrayOfCSVs.reduce((prom, csv) => {
return prom.then(() => functions(csv));
}, Promise.resolve()).then(resultX => executeFinalFunction());
}