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

jQuery Deferred returns only last value in loop

本文关键字:最后一个 循环 Deferred 返回 jQuery      更新时间:2023-09-26

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

Firebase是一个实时数据库。事件流在服务器上发生更改时。您正在尝试采用此实时模型并将其强制进入 CRUD 策略,并对数据执行 GET 操作。更好的解决方案是在修改值时实时更新值。

请参阅 AngularFire、ReactFire 或 BackboneFire,了解如何使用自己喜欢的绑定框架执行此操作的示例。

为了直接回答这个问题,如果你想检索数据的静态快照,你想对value事件使用 once() 回调,而不是来自 child_added 的实时流:

Ref.orderByChild("location").equalTo(searchLocation).once("value", function(snapshot) { def.resolve(snapshot.val()); });