【问题标题】:pubnub removeListener doesn't trigger on useEffect returnpubnub removeListener 不会在 useEffect 返回时触发
【发布时间】: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


【解决方案1】:

升级 PubNub JS SDK 修复了导致多次回调触发的问题。 https://www.pubnub.com/docs/sdks/javascript/changelog#uv4342u

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2023-03-14
    • 2023-01-26
    • 2021-07-03
    • 2021-10-25
    • 1970-01-01
    • 2021-05-05
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多