【问题标题】:React native firebase storage async/wait not waiting反应原生 Firebase 存储异步/等待不等待
【发布时间】:2020-11-23 13:51:54
【问题描述】:
    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 的日志....

【问题讨论】:

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


    【解决方案1】:
       getImage(email).then((url) => { 
          imageUrl = url
          console.log('imageUrl1:',imageUrl);
       })
    

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

    【讨论】:

      【解决方案2】:

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

      在您的具体情况下,您的第二条日志行将立即打印出初始空字符串值imageUrl。您提供给then 的回调函数将在一段时间后getImage 返回的promise 被一个值实现之后被调用。

      【讨论】:

        【解决方案3】:

        试试这个

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

        【讨论】:

        • 不起作用 --> 不能在异步函数之外使用关键字 'await'。谢谢
        • 没错,父级必须是异步函数,它必须在异步函数内
        猜你喜欢
        • 2021-01-30
        • 2020-12-26
        • 2019-10-21
        • 1970-01-01
        • 2016-07-07
        • 2016-03-25
        • 2017-10-09
        相关资源
        最近更新 更多