【问题标题】:jQuery Deferred returns only last value in loopjQuery Deferred 只返回循环中的最后一个值
【发布时间】:2015-02-01 12:11:23
【问题描述】:

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

【问题讨论】:

  • notify 在循环中,resolve 在完成时
  • 这会导致 resolve() 在第一次运行查询完成之前执行,所以我得到一个空对象作为返回值
  • 详细说明:计算结果集的总长度。 notify() 完成的每个项目。当您达到集合的总长度时,您 resolve() 延迟对象。
  • 谢谢,我要弄清楚如何在 Firebase 中获取结果集的长度
  • 这里似乎完全不需要延迟。这是实时流数据的事件处理程序,而不是一次性结果。对于静态快照,您希望使用 once('value') 而不是 on('child_added')。此外,您的代码中存在错误(解决与解决),表明它未经测试并且问题缺乏尽职调查。

标签: javascript jquery loops firebase jquery-deferred


【解决方案1】:

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

查看 AngularFire、ReactFire 或 BackboneFire 的示例,了解如何使用您最喜欢的绑定框架执行此操作。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多