javascript - javascript for循环中的异步调用
问题描述
我需要在下一步逻辑之前为每个月创建文件,但是当我在 for 循环中创建它时,它不会等到此操作完成。
我试图将 for 循环放入单独的异步方法中,我在主 deleteAvatars 方法中使用“await”调用该方法。
private async s3ListsCreator(mainPathPart: string, type: string) {
const promises = Constants.MONTHS_FOLDERS.map(async folder => {
const s3Files: string[] = await this.getAllFiles(type, folder);
try {
await this.uploadS3FilesList(mainPathPart, s3Files, folder);
} catch (err) {
this.logger.error(err);
return this.response
.addError(new HttpErrors[400](`Upload on s3 list is unsuccessful`))
.build();
}
});
await Promise.all(promises);
}
async deleteAvatars(): Promise<Response> {
try {
await this.s3ListsCreator(fixPathPart, Constants.SUBFOLDERS.avatars);
} catch (err) {
this.logger.error(err);
return this.response
.addError(new HttpErrors[400](`Upload on s3 list is unsuccessful`))
.build();
}
try {
await this.filesCleanUpLambdaCall(
Constants.LIST_NAMES.avatarsList,
avatarResolutions,
Constants.SUBFOLDERS.avatars.concat(Constants.IMAGE, '/'),
);
} catch (err) {
this.logger.error(err);
return this.response
.addError(new HttpErrors[400](`Clean up is unsuccessful`))
.build();
}
}
我需要在调用 lambda 之前创建所有文件,但我在调用 lambda 函数之前创建了随机数量的文件。
日志:
- NB-010:https ://s3.com/avatars/image/01/s3list.txt
- NB-010:https ://s3.com/avatars/image/02/s3list.txt
- NB-010:https ://s3.com/avatars/image/03/s3list.txt
- NB-010:https ://s3.com/avatars/image/04/s3list.txt
- NB-010:https ://s3.com/avatars/image/05/s3list.txt
- NB-010:https ://s3.com/avatars/image/06/s3list.txt
- NB-010:https ://s3.com/avatars/image/07/s3list.txt
- NB-010:https ://s3.com/avatars/image/08/s3list.txt
- NB-010:https ://s3.com/avatars/image/09/s3list.txt
- NB-010:https ://s3.com/avatars/image/10/s3list.txt
- NB-010:lambda 输入:{"FunctionName":"filesCleanUp","Payload":"{\"listName\":\"avatars.txt\"}"}
- NB-010:https ://s3.com/avatars/image/11/s3list.txt
- NB-010:https ://s3.com/avatars/image/12/s3list.txt
解决方案
如果将 for 循环转换为 map 则可以使用 Promise.all 来解决该问题
const promises = array.map(delayedLog);
// wait until all promises are resolved
await Promise.all(promises);
推荐阅读
- kubernetes - 如何将微服务与 Kubernetes 集群内的 NATS docker 映像连接起来
- android - 找不到符号导入 com.example.androiddata.databinding.FragmentDetailBindingImpl;
- c# - 如何在同一解决方案 Asp .NET Core 3 中的另一个项目中调用会话变量
- html - 如何在引导程序 4 中将 div 与适当的空间对齐
- flutter - 如何在颤动的文本字段中修剪空白?
- google-sheets - iferror 不返回值/错误消息
- ios - 无法创建自定义视图
- pipedrive-api - 如何更新 Pipedrive API 中的交易自定义字段?
- angular - 错误:无法匹配任何路由。URL 段:在 angular9 中
- vue.js - 如何在 vue 上使用 eventBus 触发点击事件?