javascript - 使用 Promise all 并行执行函数
问题描述
我需要执行几个并行函数
第一个功能: 数据库获取操作,即从数据库中查找库存详细信息
第二个功能: 处理db结果并将结果保存为文件
我正在使用两个promise,背靠背执行上述功能,我觉得这不是正确的方法。有没有更好的方法来处理这些函数调用。我根据以下代码得到结果,但想知道任何其他方式。
这样做的方式如下:
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)
];
}
推荐阅读
- excel - 将地理时间格式转换为 HH:MM:SS
- azure - Kubernetes 设置 Eviction Thresholds, system-reserved , kube-reserved
- r - 尝试使用 SMOTE 创建平衡训练集时出错
- javascript - 我只想显示两行第一行是标题和其他下拉选择的选项
- java - 有没有办法在 Java 中压缩字节缓冲区?
- cassandra - 为什么 Cassandra 内部不支持聚合?
- javascript - 如何在 javascript 中使用 id 或 class 选择动态创建的元素?
- c# - 无法在 Visual Studio 2017 Enterprise MSTest Selenium Unit Tests C# 中找到/添加订购的测试项目到我的项目
- bootstrap-4 - Angular 6:如何在水平标题导航栏下实现进度条
- c# - Asp Button 不工作也不执行后面的功能