如果您知道密钥,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功能吗?或者更简洁的方法来提取项目?
答案 0 :(得分:3)
您的功能可以更简单一些。
使用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;
}