React Native Firebase Storage异步/等待不等待

时间:2020-08-03 13:32:09

标签: javascript reactjs firebase async-await firebase-storage

    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 :(得分:0)

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

.then将始终在执行getImage()之后运行。这意味着在这种情况下,您的imageUrl2将首先运行。

答案 1 :(得分:0)

您所看到的是JavaScript预期的结果,与您使用的Firebase SDK无关。在JavaScript中,返回承诺的函数是异步,并且会在实现或拒绝承诺之前立即返回。您应该知道then还会异步返回一个Promise。 它不会阻止您的代码执行,也不会等待承诺被解决。您的代码将在执行任何thencatch之后继续执行。

在您的特定情况下,第二条日志行将立即以初始空字符串值imageUrl打印。在then返回的诺言值实现后,一段时间后会调用您提供给getImage的回调函数。

答案 2 :(得分:0)

尝试一下

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);