当useEffect依赖项更改时,push react native不会取消订阅

uoifb46i  于 2023-10-22  发布在  React
关注(0)|答案(1)|浏览(91)

我使用pusher(react native)来接收事件。我已经把推送器代码放在了一个带有清理函数的useEffect中。当useExcit-function的依赖关系发生变化时,用户应该断开连接,然后再次重新连接。
我的(简化)代码:

import React, {useEffect, createContext} from 'react';
import {Pusher} from '@pusher/pusher-websocket-react-native';

export const PusherContext = createContext();

const pusher = Pusher.getInstance();

export const PusherProvider = ({children}) => {
  const socket = async () => {
    console.log('connect & subscribe');

    await pusher.init({
      apiKey: 'api-key-here',
      cluster: 'eu',
    });
    await pusher.connect();
    await pusher.subscribe({
      channelName: 'channel-name',
      onEvent: event => {
        console.log('event called');
      },
    });
  };

  useEffect(() => {
    socket();

    return async () => {
      console.log('unsubscribe & disconnect');
      await pusher.unsubscribe({channelName: 'channel-name'});
      await pusher.disconnect();
    };
  }, [dependency]);

  return <PusherContext.Provider value={{}}>{children}</PusherContext.Provider>;
};

发生了什么事?一开始没问题,当我收到一个事件时,我得到一个console.log('eventcalled');只有一次。但是当依赖关系发生变化时,似乎用户根本没有断开连接,而是第二次连接,因为在那之后,我得到了console.log 2次。每当useExcit-function中的依赖项发生变化时,它就会向上计数。我在redux中存储事件,我希望每个事件只存储一次。某些事件具有相同的有效载荷。
当依赖项改变时,console.log('unsubscribe & disconnect')被打印出来,所以清理函数被调用,但它似乎没有取消订阅和/或断开连接。
这可能是一个已知的错误,还是我做错了什么?

nmpmafwu

nmpmafwu1#

私人频道甚至不订阅私人频道-
onSubscriptionSucceeded:
(channel Name,data)=> {

console.log(`Subscribed to ${channelName}`);
      // console.log(`I can now access me: ${myChannel.me}`);
      // console.log(`And here are the channel members: ${myChannel.members}`);
      const channel = pusher.getChannel(channelName);

      
    },

相关问题