Проблема с асинхронными функциями в Firebase Storage и Firestore на Ionic3 - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь получить downloadURL из загруженного мной изображения.С помощью этой функции я загружаю изображение в Firebase Storage

uploadImage() {
  this.image = 'movie-' + new Date().getTime() + '.jpg';
  let storageRef: any,
  parseUpload: any;
  return new Promise((resolve, reject) => {
  storageRef = firebase.storage().ref('imgs/' + this.image);
  parseUpload = storageRef.putString(this.cameraImage, 'data_url');     
})

Дело в том, что я хочу сохранить URL-адрес изображения, чтобы я мог взять его из документа в Firestore.Для этого у меня есть эта функция для получения dowloadURL после загрузки изображения.

Если я не ошибаюсь, этот метод должен вернуть строку, исправьте меня, если я ошибаюсь, потому что если это не такЯ не смог бы сохранить его в Firestore

async getImgFromServer(imgName: string) {
  let img;
  let downloadIMG;
  img = firebase.storage().ref("/imgs/" + imgName).getDownloadURL();
  let ref= firebase.storage().ref();
  const imgRef = ref.child("/imgs/" + imgName);
  const downloadURL = await imgRef.getDownloadURL()
  return downloadURL
}

Единственная проблема в том, что для этого необходимо загрузить изображение.Я знаю, что эта функция всегда будет возвращать URL, если изображение загружено.Дело в том, что я не знаю, как заставить эту функцию работать, когда uploadImage () завершено.После получения URL-адреса моя функция заключается в сохранении URL-адреса в базе данных Firestore Cloud.

 updateImgFromServer(image,id){
  this.firestore.doc(`public/${id}`).set({
    img:image,
  });
 }

Существует ли способ гарантировать, что вторая функция ( getImgFromServer () ) будетбыть выполненным только после того, как первый ( uploadImage () ) завершится?

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

1 Ответ

0 голосов
/ 04 декабря 2018

putString () является асинхронным и возвращает UploadTask , который отслеживает ход загрузки, который вам нужно использовать.У него есть метод then () , который работает как обещание, поэтому используйте его, чтобы определить, когда загрузка завершена.

...