用于顺序执行承诺函数的未知长度数组

问题描述 投票:-1回答:1

我正在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();
        });
    });
});
javascript arrays node.js es6-promise
1个回答
0
投票

您可以使用Array.reduce来获得先前的承诺并排队新的承诺,而无需等待。

const arrayReader = ([arrayOfCSVs]) => {
  initialFunction();
  return arrayOfCSVs.reduce((prom, csv) => {
    return prom.then(() => functions(csv));
  }, Promise.resolve()).then(resultX => executeFinalFunction());
}
© www.soinside.com 2019 - 2024. All rights reserved.