【发布时间】:2022-01-11 00:17:21
【问题描述】:
虽然打开单个聊天完美无缺,但进入聊天,然后离开聊天屏幕并再次进入聊天会导致双重消息传递,并且尽管将其置于 useEffect 中,但听众并未被删除 我什至在这个线程中尝试过解决方案:React Pubnub Chat. Message dublication or no message at all
希望你们能帮我找出问题所在。提前致谢!
useEffect(() => {
const listener = {
message: (envelope: any) => {
if (envelope) {
const message = {
channel: envelope.channel,
message: {
...envelope.message,
},
uuid: envelope.publisher,
timetoken: envelope.timetoken,
}
dispatch(setMessage(message))
// this log activates the same amount of times you entered and left the chat, because the listener isn't being removed
console.log('Message listener activated!')
}
// setLastTimeToken(message.timetoken)
},
}
pubnub.addListener(listener)
pubnub.setUUID(employer._id)
pubnub.fetchMessages(
{
channels: [ch],
count: 100,
},
(status, response) => {
if (response.channels[ch]) {
dispatch(setMessages(response?.channels[ch]))
} else {
dispatch(setMessages([]))
}
},
)
pubnub.subscribe({ channels: [ch] })
const usersInfo = channel.split('_')
if (channel != employer._id && usersInfo[1] !== 'job') {
const deeberId = usersInfo[0]
getCandidateById(deeberId).then(res => {
dispatch(setSelectedChatCandidate(res))
})
}
renderDisplayName()
return () => {
pubnub.removeListener(listener)
pubnub.unsubscribeAll()
}
}, [])
【问题讨论】:
-
您是否在
return中添加了console.log语句以确保它被调用?不知道为什么它不会,但只是想确定它正在发生。 -
另外,最后一位,` }, [])`(
useEffect的依赖项)是空的。您可能想要将envelope.channel添加到其中,如下所示:}, [envelope.channel])。可能与您的问题无关,但试一试,您可能需要它。您引用的另一篇文章就是这样做的。实际上,这可能是我现在考虑的根本原因。如果依赖项未更改,则依赖项将阻止调用useEffect。试一试,让我知道它是否有效。 -
虽然它没有解决我的问题,但为了以防万一,我把它留了下来,我通过不一遍又一遍地订阅来解决这个问题,而只是在一个频道的生命周期中订阅一次。
-
如果您在效果清理函数中调用
pubnub.unsubscribeAll(),那么调用订阅应该没有问题。但是,可能会发生一些竞争情况,但我不确定。你有没有试过打电话给pubnub.unsubscribe({ channels: [ch] })? -
@CraigConover 好吧,事实是它没有解决我的问题!但好消息是:我使用了 pubnub v4.33,并且通过将 pubnub 升级到 4.34 修复了我遇到的错误。 2.我在 github repo 中发现了一个已解决的问题,这与我遇到的问题完全相同,并且在以后的更新中得到了修复。这就是我每次订阅时都会创建我的听众的所有问题。非常感谢您的时间和您的 cmets,它确实用我的代码改进了一些东西。
标签: javascript typescript react-native pubnub