【问题标题】:Differences between 'child_added' and 'value' firebase?'child_added' 和 'value' firebase 之间的区别?
【发布时间】:2016-11-05 05:44:15
【问题描述】:

在 Firebase 中返回数据时,我发现 child_addedvalue 之间存在细微差别。使用value 我可以测试snapshot.val() 是否返回了一些东西,或者没有像这样使用它:

获取数据:

ref.orderByChild('appUserName')
    .equalTo(issuer)
    .once('value')
    .then(function (snapshot) {
      var value = snapshot.val();
      if (value) { 
          // Has Value...
      }else{
          //Has No Value...
      }

数据结构:

AppUsers --
    234jl23jl4kj23 --
        data --
            //.. data
        userName : "testUser1",
        userPass: "password123"
    9873h23foiu34u
        //same structure
    o8987s52df134o
        //same structure

如果我console.log 的值是如何返回的snapshot.val() 它会返回生成键级别的数据:

{234jl23jl4kj23 --
    {data --
        //.. data
    userName : "testUser1",
    userPass: "password123"}}

如果我使用child_added 获取数据:

ref.orderByChild('appUserName')
    .equalTo(issuer)
    .once('child_added')
    .then(function (snapshot) {
      var value = snapshot.val();
      if (value) { 
          // Has Value...
      }else{
          //Has No Value...
      }

如果没有找到issuer 作为appUserName 的值,它甚至不会进入.then 函数,所以我无法在firebase 函数中看到它是否有值。 child_added 获取数据的方式也更深一层。它不是返回生成的键,而是返回该键中的值:

{data --
   //.. data
userName : "testUser1",
userPass: "password123"}

我更喜欢以这种方式使用它,因为它会少一个循环,我必须先检查以首先获取键内的数据,然后循环遍历数据点中的对象。但是,如果issuer 不在appUserName 中,我什至不会进入函数if else

有没有办法在不循环的情况下钻入到child_added 的深度,但仍然能够执行if else 来检查snapshot.val() 是否有任何内容?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    child_added 事件会针对您查询的节点下的每个匹配子节点触发。如果没有匹配的孩子,它不会触发。

    这意味着要测试节点是否存在,您必须使用value 处理程序。而且由于一个查询可以有多个结果,因此您需要循环遍历子项。

    【讨论】:

    • 啊,那确实有道理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2023-03-04
    • 2013-10-02
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多