【问题标题】:Getting Promise Pending with Firebase and Express/Node.js使用 Firebase 和 Express/Node.js 实现 Promise Pending
【发布时间】:2016-07-15 20:32:18
【问题描述】:

我在使用 Firebase 时遇到了一些麻烦。我想使用我的 Express 服务器从我的 Firebase 数据库中检索数据,并将该数据作为我可以在我的 Jade 模板中使用的对象传递。我想从两个不同的端点获取数据并将该数据设置为我的firebaseData 对象中的键值,您将在下面看到。而不是接收带有键和值的对象,我希望我的两个值都是Promise {<pending>}。我在控制台中记录我的firebaseData 对象以查看这一点,并且在 DOM 中没有呈现任何内容。我渲染页面太快了吗?这是我正在使用的代码:

app.get("/cac", function(req, res){

  var firebaseData = {};

  function getFirebaseData(endpoint){
    return firebase.database().ref(endpoint).once("value", function(snapshot){
          return snapshot.val();
    });
  }

  firebaseData.members = getFirebaseData("CAC_Members");

  firebaseData.events = getFirebaseData("CAC_Events");

  console.log(firebaseData);
  res.render("cac", firebaseData);

});

在控制台中:

{ members: Promise { <pending> },
  events: Promise { <pending> } }

我没有任何关于承诺的经验,但我觉得我正在做的事情应该是有效的。有没有更好的方法来做到这一点?我会很感激任何指点!

【问题讨论】:

    标签: javascript express firebase pug firebase-realtime-database


    【解决方案1】:

    Firebase 数据是异步加载的。 Promise 是处理此问题的一种方式,它们非常适合您的需求。

    你的代码需要等到所有的承诺都被实现,这对Promise.all()很容易:

    app.get("/cac", function(req, res){
    
      var firebaseData = {};
    
      function getFirebaseData(endpoint){
        return firebase.database().ref(endpoint).once("value", function(snapshot){
              return snapshot.val();
        });
      }
    
      Promise.all([getFirebaseData("CAC_Members"), getFirebaseData("CAC_Events")]).then(function(snapshots) {
        firebaseData.members = snapshots[0];
        firebaseData.events = snapshots[1];
        console.log(firebaseData);
        res.render("cac", firebaseData);
      });
    });
    

    【讨论】:

    • 哇!谢谢弗兰克。这对我来说效果很好,我很欣赏及时和乐于助人的回应。
    • 开方括号有误吗?
    • 它缺少一个结束 ] 用于传递到 Promise.all() 的数组。感谢您的关注,我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2016-05-04
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多