簡體   English   中英

從firebase列表中獲取單個項目

[英]Obtaining a single item from firebase list

如果您知道密鑰,Firebase允許您查詢列表中的單個值。 但是,如果沒有密鑰,在列表中獲取單個值似乎很棘手。

我已經能夠檢索到所需的項目,但解決方案似乎冗長而且有點hacky。

繼承我的功能:( fbutil是我的firebase網址參考基礎)

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函數枚舉子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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM