【问题标题】:Asynchronous call inside a javascript for loopjavascript for循环中的异步调用
【发布时间】:2019-10-15 10:58:24
【问题描述】:

我需要在下一步逻辑之前为每个月创建文件,但是当我在 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 函数之前创建了随机数量的文件。

日志:

【问题讨论】:

  • 很抱歉我现在没有时间给出正确的答案,但你应该看看 Promise.all

标签: javascript typescript for-loop async-await


【解决方案1】:

如果你将 for 循环转换成 map,那么你可以使用 Promise.all 来解决这个问题

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多