所以我正在尝试浏览一个Firebase数据库,以查找符合条件的数据库中的条目。因此我使用jQuery的延迟对象来处理数据库调用。
从第一个数据库中获取返回值后,我想从第二个数据库中获取第一个数据库中每个值的用户信息。然后将结果添加到JSON数组
所以它:
<search for value, find one>
<<<search other db for oher info>>>
<continue search for outer value>
但是这只返回一个值 - 虽然其他一切都运行正常(并且控制台记录了所有正确的信息)。
以下是代码:
function find(searchLocation, profileID) {
var requestUserData = {
data: []
};
var def = $.Deferred();
//This will be executed as long as there are elements in the database that match the criteria and that haven't been loaded yet (so it's a simple loop)
Ref.orderByChild("location").equalTo(searchLocation).on("child_added", function(snapshot) {
def.ressolve(snapshot.val().ID);
});
return def.promise();
};
我希望你们有什么想法,或者我如何解决这个问题。提前谢谢!
编辑:经过进一步测试,我发现外部循环中已存在此问题 - 因此只返回第一个值。我认为这与resolve()方法的结果有关,但我没有找到如何改变这种行为的可能性。
答案 0 :(得分:1)
Firebase是一个实时数据库。事件流在服务器上发生更改。您正在尝试使用此实时模型并将其强制转换为CRUD策略并对数据执行GET操作。更好的解决方案是在修改值时实时更新值。
有关如何使用您喜欢的绑定框架执行此操作的示例,请参阅AngularFire,ReactFire或BackboneFire。
要直接回答这个问题,如果要检索数据的静态快照,您希望对value
事件使用once()回调,而不是来自child_added
的实时流:
Ref.orderByChild("location").equalTo(searchLocation).once("value", function(snapshot) {
def.resolve(snapshot.val());
});