javascript - 未知长度数组用于按顺序执行 promise 的功能

标签 javascript arrays node.js es6-promise

我正在一个读取 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/

相关文章:

javascript - 如何将开始和结束位置应用于 jquery 视差动画

java - 确定 Set S 中是否存在两个元素之和正好为 x - 正确解?

javascript - 无法将缓冲区写入 MongoDB GridFS

git - 如何向我的 package.json 添加非 npm 依赖项?

javascript - 是否有可能将所有 DOMS 获取到整个网站(不仅仅是一条路线)

javascript - 大型 SPA 前端中的静态与动态类型检查?

javascript - 无法读取 Object.keys 内未定义的属性 'setState',使用react

javascript - 为什么我的 MinArray 实现不回收未使用的 id?

c - 像这样初始化一个数组 pass2[2] ="aa";不起作用

node.js - Sequelize | Node.js,在两个数字之间搜索