【问题标题】:Obtaining a single item from firebase list从 Firebase 列表中获取单个项目
【发布时间】:2016-09-04 23:31:19
【问题描述】:

Firebase 允许您查询列表中的单个值(如果您知道它是键)。但是,如果您没有密钥,则在列表中获取单个值似乎很棘手。

我已经能够检索到所需的项目,但是该解决方案似乎很冗长且有点 hacky。

这是我的功能: (fbutil 是我的 firebase url 参考库)

function getCopy(number){
      var defer = $q.defer();
      var ref = fbutil.ref('copies').orderByChild("number").equalTo(number);
      ref.once("value",function(copySnap){
        if(!copySnap.exists()){
          defer.reject(null);
        }else{
          var listObj = copySnap.val();
          var list = Object.keys(listObj).map(function(copy){
              return listObj[copy]});
          defer.resolve(list[0]);
        }
      })
      return defer.promise;
    }

此代码确实有效,但我想知道是否有更好的方法来获取该项目。是否有我缺少的 firebase 功能?还是更简洁的提取项目的方法?

【问题讨论】:

    标签: javascript angularjs firebase firebase-realtime-database


    【解决方案1】:

    你的函数可以简单一点。

    使用 Firebase 3 API:

    once 函数返回一个承诺,因此您无需创建自己的承诺。并且您可以使用快照的 forEach 函数来枚举孩子 - 返回 true 以在第一个孩子之后短路枚举:

    function getCopy (number) {
      var ref = fbutil.ref('copies').orderByChild("number").equalTo(number);
      return ref.once("value").then(function (copiesSnap) {
        var result = null;
        copiesSnap.forEach(function (copySnap) {
          result = copySnap.val();
          return true;
        });
        return result;
      });
    }
    

    使用 Firebase 2 API:

    once 不返回承诺,但您仍然可以使用快照的 forEach 函数来枚举孩子 - 返回 true 以在第一个孩子之后短路枚举:

    function getCopy (number) {
      var defer = $q.defer();
      var ref = fbutil.ref('copies').orderByChild("number").equalTo(number);
      ref.once("value", function (copiesSnap) {
        var result = null;
        copiesSnap.forEach(function (copySnap) {
          result = copySnap.val();
          return true;
        });
        defer.resolve(result);
      });
      return defer.promise;
    }
    

    【讨论】:

    • 我也有同样的想法,但“一次”需要两个参数,在本例中是“值”和一个回调函数。同样,当返回“once”函数时,就好像它是一个承诺一样,它总是未定义的。不幸的是,这对我不起作用..
    • successCallback 对应于 once 是可选的。如果没有通过,它应该返回一个承诺。您使用的是 Firebase 3,对吗?
    • 有趣,我使用的是 firebase 2,但是根据我的 bower.json 是 2.2.2
    • 已更新以包含 Firebase 2 示例。
    • 谢谢,每次都查找密钥要好得多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2021-12-07
    相关资源
    最近更新 更多