从firebase列表中获取单个项目

Obtaining a single item from firebase list

本文关键字:单个 项目 获取 firebase 列表      更新时间:2023-09-26

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

我已经能够检索所需的项目,但是解决方案似乎冗长和有点黑客。

下面是我的函数:(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功能,我错过了?或者用更简洁的方式提取项目?

你的函数可以更简单一些。

使用Firebase 3 API:

once函数返回一个promise,因此您不需要创建自己的promise。您还可以使用快照的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;
}