Асинхронный вызов внутри JavaScript для цикла - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно создать файл для каждого месяца, до следующего шага логики, но когда я создаю его внутри для цикла, он не ждет до завершения этой операции.

Я пытался принять цикл вотдельный асинхронный метод, который я вызываю внутри основного метода 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();
    }
}

Мне нужно создать все файлы перед лямбда-вызовом, но я создаю произвольное количество файлов перед тем, как вызвать лямбда-функцию.

logs:

1 Ответ

1 голос
/ 15 октября 2019

если вы конвертируете цикл for в карту, вы можете использовать Promise.all для решения этой проблемы

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