Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Promise all运行功能的并行执行_Javascript_Node.js_Promise_Parallel Processing - Fatal编程技术网

Javascript 使用Promise all运行功能的并行执行

Javascript 使用Promise all运行功能的并行执行,javascript,node.js,promise,parallel-processing,Javascript,Node.js,Promise,Parallel Processing,我需要执行几个并行函数 第一个功能: 数据库获取操作,即从数据库中查找库存详细信息 第二功能: 处理数据库结果并将结果保存为文件 我使用的是两个promise all,背靠背来执行上述函数,我觉得这不是正确的方法。有没有 处理这些函数调用的更好方法。我得到的结果根据下面的代码,但想知道任何其他方式 按以下方式操作: let allQuery = { sql: "SELECT * from inventory", }; let inventoryQuery = { sql: "SELECT

我需要执行几个并行函数

第一个功能: 数据库获取操作,即从数据库中查找库存详细信息

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

我使用的是两个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(第一承诺)
.然后(转换为第二个副本)
.然后(承诺,全部)
.then(值=>{/*do later operation*/})
.catch(错误=>{debug(`error in promissions${error}`)})
函数transformToSecondPromises([全部,库存,附近]){
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+'/'+nearner.QueryExecutionId+'.csv';
const fileName3=nearear.QueryExecutionId+'.csv';
返回[
s3Service.s3StreamDownload(bucketName、fileKey1、fileName1),
s3Service.s3StreamDownload(bucketName、fileKey2、fileName2),
s3Service.s3StreamDownload(bucketName、fileKey3、fileName3)
];
}

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

Promise.all(第一承诺)
.然后(转换为第二个副本)
.然后(承诺,全部)
.then(值=>{/*do later operation*/})
.catch(错误=>{debug(`error in promissions${error}`)})
函数transformToSecondPromises([全部,库存,附近]){
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+'/'+nearner.QueryExecutionId+'.csv';
const fileName3=nearear.QueryExecutionId+'.csv';
返回[
s3Service.s3StreamDownload(bucketName、fileKey1、fileName1),
s3Service.s3StreamDownload(bucketName、fileKey2、fileName2),
s3Service.s3StreamDownload(bucketName、fileKey3、fileName3)
];
}

这看起来基本上是合理的,虽然我更喜欢
返回承诺,而不是使用回调反模式(并避免
捕获
),但您也可以使用参数分解使其更干净:
。然后([all,inventory,near])=>{}而不是
。然后((value)=>{})
。这样,您就可以摆脱手动定义的变量,这些变量的名称与您应该使用的名称相同。否则就没问题了-如果你真的不想在所有查询完成之前开始任何下载。这看起来基本上是合理的,尽管我更喜欢
返回
承诺,而不是使用回调反模式(并避免
捕获
),你也可以使用参数解构来使它更干净:
(([all,inventory,neared])=>{}而不是
。然后((value)=>{})
。这样你就可以摆脱手动定义的同名变量。否则就没关系了——如果你真的不想在所有查询完成之前开始任何下载。