我正在一个读取 CSV 文件的 node.js 服务器上创建一个函数,我需要读取所有行并为每个行执行几个 promise 的操作(MySQL 查询)(更新或插入,然后设置一个指定的列将此项目标识为“在此执行中修改”),一旦完成,更改未更新或插入的另一列以将此项目标识为“已删除”
起初,我遇到的问题是这个 CSV 有数百万行(字面意思)和一百列,所以我很容易用完内存,而且这些行数可以增加或减少,所以我不知道每次收到它时我都必须处理的行数。
我制作了一个简单的程序,允许我用可读的行数将这个 CSV 文件与其他一些文件分开,这样我的服务器就可以与每个文件一起工作而不会死机,从而使每个新文件被处理的文件数量未知,所以现在我有一个不同的问题。
我想读取所有这些 CSV,进行这些操作,并在这些操作完成后执行最后一个操作,这将更改那些未更新/插入的内容。唯一的问题是我需要阅读所有这些内容并且我不能同时这样做,我必须按顺序进行,无论它们有多少(如前所述,在分离主要 CSV 之后,我可能有 100 万行分为3 个文件,或 200 万分为 6 个文件)。
起初我想使用 forEach 循环,但问题是,foreach 不尊重 promise ,所以它会启动所有这些,服务器将在加载所有这些 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());
}
关于javascript - 未知长度数组用于按顺序执行 promise 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58744634/