'child_added'之间的差异和'价值'火力?

时间:2016-11-05 05:44:15

标签: javascript firebase firebase-realtime-database

我在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...
      }

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

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

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

有没有办法可以在没有循环的情况下尽可能深入child_added,但仍然可以if else检查snapshot.val()是否有任何内容?

1 个答案:

答案 0 :(得分:7)

child_added事件将为您查询的节点下的每个匹配子项触发。如果没有匹配的孩子,则不会开火。

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