Реагировать на собственное хранилище firebase async / ждать, не ожидая - PullRequest
0 голосов
/ 03 августа 2020
    export async function getImage(key){
        let url = '';
        try{
          const imageRef = storage().ref(key)
          url = await imageRef.getDownloadURL();
        }catch(e){ console.log(e)}
        return url;
    }

тогда ... в вызове

   imageUrl='';
   getImage(email).then((url) => { 
      imageUrl = url
      console.log('imageUrl1:',imageUrl);
   })

   console.log('imageUrl2:',imageUrl);

результат:

imageUrl2:

imageUrl1: url: https://firebasestorage.googleapis.com/.....

Сначала я ожидал журнал imageUrl1 ....

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

То, что вы видите, ожидается в JavaScript и не имеет ничего общего с используемым вами Firebase SDK. В JavaScript функции, возвращающие обещание, являются асинхронными и возвращаются немедленно, прежде чем обещание будет выполнено или отклонено. Вы должны знать, что then также асинхронно возвращает обещание. Он не блокирует выполнение вашего кода и не дожидается выполнения обещания. Ваш код будет продолжать выполняться после любых then или catch.

В ваших c случай, ваша вторая строка журнала будет немедленно напечатана с начальным значением пустой строки imageUrl. Функция обратного вызова, которую вы предоставляете then, будет вызвана через некоторое время , после того как обещание, возвращаемое getImage, будет выполнено со значением.

0 голосов
/ 03 августа 2020

Попробуйте это

export async function getImage(key){
    let url = '';
    try{
      const imageRef = await storage().ref(key)
      url = await imageRef.getDownloadURL();
      return url;
    }catch(e){ 
      console.log(e)
     }      
 };

   const url = await getImage(email);
   console.log('imageUrl:',url);
 
0 голосов
/ 03 августа 2020
   getImage(email).then((url) => { 
      imageUrl = url
      console.log('imageUrl1:',imageUrl);
   })

. Then всегда будет запускаться после выполнения getImage (). Это будет означать, что ваш imageUrl2 будет запущен первым в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...