【问题标题】:Why is my javascript code running out of order? [duplicate]为什么我的 javascript 代码出现故障? [复制]
【发布时间】:2018-11-25 19:37:58
【问题描述】:

我正在尝试显示我的 firebase 数据库中的数据和 firebase 存储中的图像。目前它似乎在另一个之前运行我的一些代码。我在下面显示了我的代码:

 <script>
            var wrapper = document.getElementById("myHTMLWrapper");
            var myHTML = '';
            var databaseRef = firebase.database().ref('items/');
            databaseRef.once('value', function(snapshot)
            {
              snapshot.forEach(function(childSnapshot) 
              {
                var childKey = childSnapshot.key;
                var childData = childSnapshot.val();
                myHTML += '<div class="card">';
                myHTML += '<div class="card-body">';
                var urlimage;
                storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
                    urlimage = url;
                    console.log(urlimage);
                });
                console.log('url outside of function is: '+urlimage);
                myHTML += '<img src="'+ urlimage +'" class="img-thumbnail" height="">';
                console.log('images/'+ childData.id +'.jpg');
                myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
                myHTML += '</div>';
                myHTML += '</div>';
              });
              wrapper.innerHTML = myHTML;
            });
          </script>

它从数据库中正确返回数据,但在解析图像的 URL 时遇到问题。从我的控制台日志来看,问题似乎是代码到达了 console.log('url outside of function is: '+urlimage);在它到达 console.log(urlimage) 之前;即使它在代码结构中高于它。我认为这与 Javascript 如何处理它有关。我将非常感谢一些帮助。提前致谢。

【问题讨论】:

    标签: javascript html firebase firebase-storage


    【解决方案1】:

    看起来“getDownloadURL”返回了一个 Promise,当该 Promise 被解决时,您将获得 url,因此您解释的行为是正常的。如果要使用 url 值,则必须将代码移动到回调函数中。像这样的

    var getURL = function(childSnapshot) {
       var childKey = childSnapshot.key;
       var childData = childSnapshot.val();
       return storageRef.child('images/'+ childData.id +'.jpg').getDownloadURL().then(function(url){
           var myHTML = '';
           myHTML += '<div class="card">';
           myHTML += '<div class="card-body">';
           myHTML += '<img src="'+ url +'" class="img-thumbnail" height="">';
    
           myHTML += '<h4>'+ childData.sku + ' - ' + childData.name +'</h4>';
           myHTML += '</div>';
           myHTML += '</div>';
           return myHTML;
      });
    }
    var promises = [];
    snapshot.forEach(function(childSnapshot) {
           promises.push(getURL(childSnapshot));
    }  
    Promise.all(promises).then(results => {
         wrapper.innerHTML = results.join('');
    }   
    

    【讨论】:

    • 嗯,有道理。但是我遇到了一个问题,它只是跳过了回调函数。 myHTML 只是显示空白的地方。你怎么看?谢谢。
    • 如果回调没有被调用,那意味着你的 Promise 被拒绝了。我想是因为“。”你有你的密钥(.jpg),但你可以添加一个 catch 块来查看它被拒绝的确切原因。
    • 我为造成的混乱道歉。我的意思是当它到达代码的那部分时它会跳过它。承诺最终得到解决,但这是在页面已经将 wrapper.innerHTML 设置为空的 myHTML 之后。
    • 你必须使用 Promise.all 。等到所有 URL 都被检索到,然后设置 wrapper.innerHTML。
    • 再次感谢 Reza。我对promise.all不太熟悉。请您澄清一下好吗?感谢您的时间和专业知识。
    猜你喜欢
    • 2021-08-04
    • 2018-07-27
    • 2016-09-16
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多