Как дождаться окончания цикла for с использованием async await в javascript? - PullRequest
0 голосов
/ 21 сентября 2018

Мой вариант использования.

  1. Я загружаю 5 изображений на сервер s3 в браузере и получаю URL-адреса для загруженных изображений.
  2. Передача, которая обращается кback-end.

Это моя асинхронная функция

try{
    await uploadImagesToS3(imagesArray);

    await saveUrlsInBackend();

}catch(error){

}

В моей uploadImagesToS3 функции я пытаюсь сделать что-то вроде этого.

uploadImagesToS3(){
    resolve(FORLOOP)
}

После запуска цикла 5 раз я хочу разрешить его в моей основной асинхронной функции.

Это моя настоящая uploadImagesToS3 функция

onUpload(array, albumName) {
      return new Promise((resolve, reject) => {
        resolve(
          for (let index = 0; index < array.length; index++) {
          var files = document.getElementById(array[index]).files;
          if (!files.length) {
            return alert("Please choose a file to upload first.");
          }
          var file = files[0];
          var fileName = file.name;
          var albumPhotosKey = encodeURIComponent(albumName) + "//";

          var photoKey = albumPhotosKey + fileName;
          self;
          s3.upload(
            {
              Key: photoKey,
              Body: file,
              ACL: "public-read"
            },
            (err, data) => {
              if (err) {
                return alert(
                  "There was an error uploading your photo: ",
                  err.message
                );
              }
              // alert("Successfully uploaded photo.");
              this.images[index].image_path = data.Location;
            }
          );
        }
        );
      });
    }

Но это не позволяет мне использовать цикл for внутри функции разрешения.Как я могу достичь этих асинхронных механизмов ожидания?

1 Ответ

0 голосов
/ 21 сентября 2018

"resolve(FORLOOP)" - нет, это не так, как оно будет работать.

Вам следует обещать только метод s3.upload в функцию, которая просто вызывает его и возвращаетобещание результата и ничего больше:

function upload(value) {
  return new Promise((resolve, reject) => {
    s3.upload(value, (err, res) => {
      if (err) reject(err);
      else resolve(res);
    });
  });
}

Теперь вы можете использовать это в своем методе, либо связав вместе обещания, либо просто используя async / await:

async onUpload(array, albumName) { /*
^^^^^ */
  for (const id of array) {
    const files = document.getElementById(id).files;
    if (!files.length) {
      alert("Please choose a file to upload first.");
      return;
    }
    const file = files[0];
    const albumPhotosKey = encodeURIComponent(albumName) + "//";

    const photoKey = albumPhotosKey + file.name;
    try {
      const data = await upload({
//                 ^^^^^
        Key: photoKey,
        Body: file,
        ACL: "public-read"
      });
      // alert("Successfully uploaded photo.");
      this.images[index].image_path = data.Location;
    } catch(err) {
      alert("There was an error uploading your photo: ", err.message);
      return;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...