imagesURI дает много обещаний, как использовать обещание. все в этом случае - PullRequest
0 голосов
/ 09 октября 2018

Эта функция для отправки массива изображений в хранилище Firebase и получения URL для их размещения в базе данных Firebase.

uploadImages(images, callBack) {
    this.uploadedImages = [];
    for (let index = 0; index < images.length; index++) {
      const imagesURI = storage()
        .ref("images/")
        .child(this.uid())
        .child(index + "");
      imagesURI.putString(images, "data_url").then(() => {
        imagesURI.getDownloadURL().then(url => {
          console.log(url);
          this.uploadedImages.push(url);
          console.log(this.uploadedImages);
        });
      });
    }
    callBack(this.uploadedImages);
  }

Как я могу использовать Promise.all в этом случае?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Ваша функция uploadImages вызывает функцию обратного вызова с массивом обещаний.

Вы можете просто передать функцию обратного вызова в «uploadImages» и использовать возвращенный массив или обещания с Promise.all.

uploadImages(images, promises => {
  Promise
    .all(promises)
    .then(results => { 
      //do something with 
    })
    .catch(error => {
      // handle error
    })
})
0 голосов
/ 09 октября 2018

И putString, и getDownloadURL возвращают обещание, так что вы можете просто всплыть и добавить их в массив для Promise.all.

uploadImages(images, callBack) {
    let promises = [];
    for (let index = 0; index < images.length; index++) {
      const imagesURI = storage()
        .ref("images/")
        .child(this.uid())
        .child(index + "");
      let promise = imagesURI.putString(images, "data_url").then(() => {
          return imagesURI.getDownloadURL();
        })
      promises.push(promise);
    }
    Promise.all(promises).then(function(urls)
      this.uploadedImages = urls;
      callBack(this.uploadedImages);
    });
}

Обратите внимание, что я сосредоточился только наиспользование обещаний для захвата после завершения загрузки.В коде могут быть и другие ошибки.

Как прокомментировал Берги, вы также можете заменить обратный вызов возвращением обещания:

uploadImages(images, callBack) {
    let promises = [];
    for (let index = 0; index < images.length; index++) {
      const imagesURI = storage()
        .ref("images/")
        .child(this.uid())
        .child(index + "");
      let promise = imagesURI.putString(images, "data_url").then(() => {
          return imagesURI.getDownloadURL();
        })
      promises.push(promise);
    }
    return Promise.all(promises)
}

При этом вы можете вызвать его с помощью:

uploadImages(imageArray).then(function(downloadUrls) {
  console.log(downloadUrls);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...