Firebase“ child_changed”听众的理解

时间:2019-01-15 06:27:41

标签: javascript node.js reactjs firebase firebase-realtime-database

我正在尝试从Firebase获取有关系统生命周期中问题状态的实时更改。我的child_changed事件的互动方式与我预期的不同,因此我不确定自己是否使用正确。

我想获取对questionStatus变量的新更改,以便如果系统上的另一个用户更改了数据库上的变量,则两个用户都可以实时看到更新。我的Firebase数据库的设置如下:

-/questions
     -/ID1234567890
          -/title
          -/messages
               -/ID1234567890
               -/ID2345678901

“ child_changed”通话:

fire.database().ref('/questions/' + this.state.questionId + '/questionStatus').on('child_changed', snap => {
      this.setState({
        questionStatus: (snap.val().questionStatus),
      })
      console.log("CHANGED!")
    })

上面的代码是我认为应该如何工作的方式,但是我永远无法使console.log像预期的那样显示。通过仅从questionStatus中删除ref()(如下面的代码中概述),每当我向问题添加新消息(用于聊天)时,该事件就会触发,并且似乎导致加载错误。我误解了firebase还是我的代码更深入?也许这与组件的生命周期有关?我尝试将其放置在任何地方都无济于事,但目前在componentWillMount()中使用了它。让我知道您的想法,谢谢!

fire.database().ref('/questions/' + this.state.questionId).on('child_changed', snap => {
      this.setState({
        questionStatus: (snap.val().questionStatus),
      })
      console.log("CHANGED!")
    })

1 个答案:

答案 0 :(得分:0)

根据我的研究,我不完全了解setState(),不知道状态只能异步更新,而不能同步。知道了这一点,我刚刚实现了一项功能,通知用户状态已更改并单击按钮以重新加载。这并不理想,但现在可以使用。

我还测试了排除具有特定键(messages)的孩子。

所以我的新代码如下:

fire.database().ref('/questions/' + this.state.questionId).on('child_changed', snap => {
      // Ignore if messages are being added to the ticket
      if(snap.key !== 'messages'){
        this.setState({
          questionStatus: (snap.val().questionStatus),
          questionTags: (snap.val().questionTags),
          question
        })
      }
    })