我有这样的数据库结构:
我的听众:
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
})