jQuery Deferred仅返回循环中的最后一个值

时间:2014-12-03 19:29:51

标签: javascript jquery loops firebase jquery-deferred

所以我正在尝试浏览一个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()方法的结果有关,但我没有找到如何改变这种行为的可能性。

1 个答案:

答案 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()); });