首页 > 解决方案 > 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 函数之前创建了随机数量的文件。

日志:

标签: javascripttypescriptfor-loopasync-await

解决方案


如果将 for 循环转换为 map 则可以使用 Promise.all 来解决该问题

const promises = array.map(delayedLog);
// wait until all promises are resolved
await Promise.all(promises);

推荐阅读