Javascript Firebase getDownloadURL()未更新全局变量

Javascript Firebase getDownloadURL()未更新全局变量,javascript,firebase-storage,Javascript,Firebase Storage,我有以下脚本 let link = "" let baseUrl = "Test-Dataset/" let imageRef = "2.jpg" storage.ref(baseUrl + imageRef).getDownloadURL().then( function(url) { link = url console.log(url) }).catch(function(error) { });

我有以下脚本

    let link = ""
    let baseUrl = "Test-Dataset/"
    let imageRef = "2.jpg"

    storage.ref(baseUrl + imageRef).getDownloadURL().then(
      function(url) {
      link = url
      console.log(url)
    }).catch(function(error) {
    });

    console.log(link)
我的目标是在使用
getDownloadURL()
返回承诺并等待解决后,使用图像URL的值更新
link
变量。.this()中的
console.log
函数正输出我所需的内容-指向firebase存储中图像的链接。但是,函数外部的
console.log
正在返回调用我的firebase存储之前的
链接的初始值,即
。为什么会发生这种情况?我的解决方案是否与中概述的异步函数类似


详细信息:我正在使用vue和npm库
firebase

发生这种情况是因为您的console语句在承诺解决之前运行。这与Firebase无关

情况就是这样:

  • 链接
    变量用空字符串声明
  • 一个处理函数被添加到承诺中:
    。然后(函数(url){…})
  • console.log(link)
    输出仍然是空字符串的
    link的值
  • 承诺解析并将
    链接设置为
    url
  • 尝试在代码的末尾添加以下内容,以便更清楚地看到效果:

    setTimeout(() => {
      console.log(link);
    }, 1000);
    
    这将在1秒后输出
    link
    的值。它的值应该是您想要的URL

    要解决此问题,可以使用async/await

    const getLink=async(ref)=>{
    const url=await storage.ref(ref).getDownloadURL();
    返回url;
    }
    //注意:使用'await'的函数必须是'async'`
    //因此,无论哪个函数使用getLink(),都必须是异步的
    函数async someFunction(){//可能是Vue方法?
    const url=wait getLink(baseUrl+imageRef);
    console.log(url);
    }
    
    要添加错误处理,请使用try/catch块:

    函数异步someFunction(){
    试一试{
    const url=await storage.ref(baseUrl+imageRef).getDownloadURL();
    console.log(url);//如果获取url失败,此操作将不会运行
    }捕获(错误){
    //处理错误
    }
    }