push()之后触发“ child_changed”

时间:2019-01-12 15:25:12

标签: javascript firebase

我有这样的数据库结构:

enter image description here

我的听众:

 this.dbMessagesRef
    .child(channelId)
    .orderByChild('timestamp')
    .startAt(lastTimestamp)
    .on('child_added', (snap) => {
      const message = snap.val()
      message.key = snap.key
      messages.push(message)

      this.setState({ messages, messagesLoading: false })
  })

  this.dbMessagesRef.child(channelId).on('child_changed', (snap) => {
    const changedMessage = snap.val()
    const index = messages.findIndex(message => message.key === snap.key)
    messages[index] = { ...changedMessage, key: snap.key, edited: true }

    this.setState({ messages })
  })

它正在创建这样的消息:

this.dbMessagesRef.child(currentChannel.id).push({...})

为什么'child_changed'push()之后触发?换句话说,两个事件都在触发。我知道如何解决这个问题,但是这种方式不好。 例如:

  let ignoredKeyAfterAdding = null

  this.dbMessagesRef
    .child(channelId)
    ...
    .on('child_added', (snap) => {
      ignoredKeyAfterAdding = snap.key

      // ...other code
    })

  this.dbMessagesRef.child(channelId).on('child_changed', (snap) => {
    if (snap.key === ignoredKeyAfterAdding) {
      ignoredKeyAfterAdding = null
      return
    }

    // ...other code
  })

0 个答案:

没有答案