javascript - 使用 Promise all 并行执行函数

标签 javascript node.js promise parallel-processing

我需要执行多个并行函数

第一个功能: 数据库获取操作即从数据库查找库存明细

第二个功能: 处理数据库结果并将结果保存为文件

我使用两个promise all,背靠背来执行上述函数,我觉得这不是正确的方法。有没有 处理这些函数调用的更好方法。我按照下面的代码得到结果,但想知道任何其他方式。

按照以下方式进行:

let allQuery = {
  sql: "SELECT * from inventory",
};
let inventoryQuery = {
  sql: "SELECT * from inventory where inventory='1'",

};
let nearbyQuery = {
  sql: "SELECT * from inventory where inventory='2",

};
let firstPromises = [dbService.fetch(allQuery),
  dbService.fetch(inventoryQuery),
  dbService.fetch(nearbyQuery)
];
Promise.all(firstPromises)
    .then((values) => {
      let all = values[0];
      let inventory = values[1];
      let nearby = values[2];
      let fileKey1 = folderName + '/' + all.QueryExecutionId + '.csv';
      let fileName1 = all.QueryExecutionId + '.csv';
      let fileKey2 = folderName + '/' + inventory.QueryExecutionId + '.csv';
      let fileName2 = inventory.QueryExecutionId + '.csv';
      let fileKey3 = folderName + '/' + nearby.QueryExecutionId + '.csv';
      let fileName3 = nearby.QueryExecutionId + '.csv';
      let secondPromises = [s3Service.s3StreamDownload(bucketName, fileKey1, fileName1),
        s3Service.s3StreamDownload(bucketName, fileKey2, fileName2),
        s3Service.s3StreamDownload(bucketName, fileKey3, fileName3)
      ];
      Promise.all(secondPromises)
          .then((values) => {
            console.log('Do later operation');

          }).catch((error) => {
        debug(`Error in promises ${error}`);

      });

    }).catch((error) => {
  debug(`Error in promises ${error}`);

});

最佳答案

我认为提取内部函数然后将它们链接在一起会更具可读性:

Promise.all(firstPromises)
  .then(transformToSecondPromises)
  .then(Promise.all)
  .then(values => {/* do later operation */})
  .catch(error => { debug(`Error in promises ${error}`) })

function transformToSecondPromises ([all, inventory, nearby]) {
  const fileKey1 = folderName + '/' + all.QueryExecutionId + '.csv';
  const fileName1 = all.QueryExecutionId + '.csv';
  const fileKey2 = folderName + '/' + inventory.QueryExecutionId + '.csv';
  const fileName2 = inventory.QueryExecutionId + '.csv';
  const fileKey3 = folderName + '/' + nearby.QueryExecutionId + '.csv';
  const fileName3 = nearby.QueryExecutionId + '.csv';
  return [
    s3Service.s3StreamDownload(bucketName, fileKey1, fileName1),
    s3Service.s3StreamDownload(bucketName, fileKey2, fileName2),
    s3Service.s3StreamDownload(bucketName, fileKey3, fileName3)
  ];
}

关于javascript - 使用 Promise all 并行执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60719648/

相关文章:

javascript - Cannot POST/test.php 当我试图将数据输入数据库时​​它给了我这个错误

javascript - 为什么 JS 中的别名 'this' 如此容易出错?

javascript - 如何添加一个计数器来显示 div 元素被点击了多少次?

javascript - 在jquery中获取多个延迟对象的响应

javascript - 返回静态值作为 promise

javascript - Node JS : Array loop and function Not understanding how callbacks and promises work

javascript - XMLHttpRequest POST 多部分/表单数据

node.js - 安装 Gulp 和 Bower 时出错

node.js - npm coffescript安装错误

javascript - NightmareJS 在 Promise 中循环操作不等待结果