Javascript 从firebase列表中获取单个项目

Javascript 从firebase列表中获取单个项目,javascript,angularjs,firebase,firebase-realtime-database,Javascript,Angularjs,Firebase,Firebase Realtime Database,Firebase允许您查询列表中的单个值(如果您知道它是键)。但是,如果您没有键,那么在列表中获取单个值似乎很棘手 我已经能够检索到所需的项目,但是解决方案似乎冗长且有点粗糙 这是我的职责: (fbutil是我的firebase url参考库) 此代码确实有效,但我想知道是否有更好的方法获取该项目。是否有我缺少的firebase功能?或者一种更简洁的方法来提取项目?您的函数可以简化一点 使用Firebase 3 API: 该函数返回一个承诺,因此您无需创建自己的承诺。您可以使用快照的函数枚举子项

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

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

这是我的职责: (fbutil是我的firebase url参考库)


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

您的函数可以简化一点

使用Firebase 3 API:

该函数返回一个承诺,因此您无需创建自己的承诺。您可以使用快照的函数枚举子项-返回
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;
  });
}
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;
}
使用Firebase 2 API:

不返回承诺,但您仍然可以使用快照的函数枚举子项-返回
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;
  });
}
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”需要两个参数,在本例中是“value”和一个回调函数。同样,当返回“once”函数时,就好像它是一个承诺一样,它总是未定义的。不幸的是,这对我不起作用。
successCallback
for
once
是可选的。如果它没有通过,它应该返回一个承诺。您使用的是Firebase 3,对吗?有趣的是,我使用的是Firebase 2,但是,根据我的bower.json更新,2.2.2包含了一个Firebase 2示例。谢谢,每次查找密钥都会更好!