首页 > 解决方案 > 用于顺序执行承诺函数的未知长度数组

问题描述

我在读取 CSV 文件的 node.js 服务器上创建一个函数,我需要读取所有行并为每个行执行几个承诺的操作(MySQL 查询)(更新或插入,然后设置一个指定的列来标识该项目作为“在此执行中修改”),一旦完成,更改未更新或插入的列上的另一列,以将该项目标识为“已删除”

起初,我遇到的问题是这个 CSV 有数百万行(字面意思)和一百列,所以我很容易耗尽内存,而且这个行数可以增加或减少,所以我不知道行数每次收到时我都必须处理。

我制作了一个简单的程序,允许我将此 CSV 与其他一些具有可读行数的行分开,这样我的服务器就可以在不死机的情况下处理它们中的每一个,从而使每个新文件被处理的文件数量未知,所以现在我有不同的问题。

我想读取所有这些 CSV,进行这些操作,并且一旦这些操作完成,执行最后一个将更改那些未更新/插入的操作。唯一的问题是我需要阅读所有这些并且我不能同时这样做,我必须按顺序进行,无论它们有多少(如前所述,在分离主 CSV 之后,我可能有 100 万行分为3 个文件,或 200 万个 6 个文件)。

起初我虽然关于使用 forEach 循环,但问题是,foreach 不尊重承诺,所以它会启动所有这些,当加载所有这些 CSV 时服务器将耗尽内存然后死掉。老实说,在 foreach 的每次迭代中使用一段时间(布尔值)来等待每个 promisified 函数的解析似乎很漂亮......对我来说很臭,而且我觉得这个解决方案会阻止服务器正常工作所以我寻找不同的解决方案。

让我快速解释一下我想要什么:

const arrayReader=(([arrayOfCSVs])=>{
initialFunction();
functions(arrayOfCSVs[0])
  .then((result)=>{
    functions(arrayOfCSVs[1])
      .then((result2)=>{
        functions(arrayOfCSVs[2])
        (OnAndOnAndOnAndOn...)
        .then((resultX)=>{
          executeFinalFunction();
        });
    });
});

标签: javascriptarraysnode.jses6-promise

解决方案


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

const arrayReader = ([arrayOfCSVs]) => {
  initialFunction();
  return arrayOfCSVs.reduce((prom, csv) => {
    return prom.then(() => functions(csv));
  }, Promise.resolve()).then(resultX => executeFinalFunction());
}

推荐阅读