Как обрабатывать несколько асинхронных запросов?

1

Поэтому в моем приложении пользователь может загружать от 1 до 3 снимков, а когда он нажимает кнопку сохранения, я загружаю их в firebase.

Это мой код до сих пор, и я знаю, что это ужасно, и я ищу способ сделать его эффективным.

    if (img1) {
      uploadImage(img1, 'image/jpeg', 'imageOne', uuid)
      .then(() => {
        console.log('Image 1 was uploaded succesfully');

      }).catch(err => console.log(err));
    }

    if (img2) {
      uploadImage(img2, 'image/jpeg', 'imageTwo', uuid)
      .then(() => {
        console.log('Image 2 was uploaded succesfully');

      }).catch(err => console.log(err));
    }

    if (img3) {
      console.log('there is img3')
      uploadImage(img3, 'image/jpeg', 'imageThree', uuid)
      .then(() => {
        console.log('Image 3 was uploaded succesfully');

      }).catch(err => console.log(err));
    }

Дело в том, что я хочу перенаправить пользователя на домашнюю страницу при завершении загрузки. Но трудно решить, куда должен идти код перенаправления.

Я думал о выполнении вложенных операторов:

if (img1) {
      uploadImage(img1, 'image/jpeg', 'imageOne', uuid)
      .then(() => {
        console.log('Image 1 was uploaded succesfully');

        if (img2) {
          uploadImage(img2, 'image/jpeg', 'imageTwo', uuid)
          .then(() => {
            console.log('Image 2 was uploaded succesfully');

          }).catch(err => console.log(err));
        }


      }).catch(err => console.log(err));
    }

но что, если пользователь загрузил только img2, а не img1? Тогда img2 никогда не будет загружен. Как я могу улучшить свой код?

Показать ещё 1 комментарий
Теги:
asynchronous

2 ответа

1
Лучший ответ

проверьте Promise.all - Bluebird - хорошая библиотека для обещаний, хотя сейчас тоже круто. http://bluebirdjs.com/docs/api/promise.all.html

будет выглядеть примерно так:

var p = [];

if (img1) p.push(uploadImg(img1...));
if (img2) p.push(uploadImg(img2...));
if (img3) p.push(uploadImg(img3...));

return Promise.all(p).then(function() {
    // redirection here
});
  • 0
    Большое спасибо!
2

Вы можете использовать Promise.all

let promises = [];
if (img1) {
    promises.push(uploadImage(img1, 'image/jpeg', 'imageOne', uuid);
}
if (img2) {
    promises.push(uploadImage(img2, 'image/jpeg', 'imageTwo', uuid);
}

// etc...

Promise.all(promises).then(() => {console.log("All requests are done")})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню