javascript - react Pubnub 聊天。消息重复或根本没有消息

标签 javascript reactjs sdk chat pubnub

我的 React 网站一直存在问题。我们正在使用 pubnub SDK 创建一个聊天组件,这样人们就可以互相聊天了。所有 channel 管理都已完成,但问题是每次我切换 channel 时所有消息都会被复制,而且它们只会在 Dom 中被复制。 PubNub 的历史 API 仅返回一条消息,但仅在刷新后返回,因为该组件仅在挂载或 channel 更改时获取历史消息。

这是负责消息的代码

export default function Chat({ chatRoom, person, task }) {
  const [messages, addMessage] = useState([]); //messages that are being mapped in the JSX
  const [message, setMessage] = useState("");//set by the input field in the JSX


//adding the pubnub listeners on mount
  useEffect(() => {
    console.log("ADDING LISTENER");

    pubnub.addListener({
      message: (message) => {
        if (message) {
          addMessage((messages) => [...messages, message]);
          console.log(message.message);
        }
        scrollingComponent.current.scrollIntoView({ behavior: "smooth" });
      },
      file: handleFile,
    });

    pubnub.subscribe({ channels: [chatRoom] });

//cleaning listeneres on dismount
    return function cleanup() {
      pubnub.removeListener({
        message: (message) => {
          if (message) {
            addMessage((messages) => [...messages, message]);
            console.log(message.message);
          }
          scrollingComponent.current.scrollIntoView({ behavior: "smooth" });
        },
        file: handleFile,
      });

      pubnub.unsubscribeAll();
      addMessage([]);
    };
  }, [chatRoom]);



//added this function and it's coresponding useEffect just to test if thats the cause of the dublication. Before that the function sendMessage had the body of the use effect
const sendMessage = (m) => {
  console.log(m);
  setMessage("");
};

  useEffect(() => {
    if (message) {
      pubnub
        .publish({
          channel: chatRoom,
          message: message,
          storeInHistory: true,
        })
        .then(() => {
          pubnub.signal({
            channel: chatRoom,
            message: "notification",
          });
          pubnub.signal({
            channel: chatRoom,
            message: "not_typing",
          });
        })
        .catch((error) =>
          addMessage((messages) => [...messages, error.toString()])
        );
    }
  }, [sendMessage]);

//code continues...

如果需要,我可以发布整个 .js 文件

最佳答案

您的代码中的问题是您没有正确删除监听器。您正在重新创建相同的函数两次(但不是同一个函数),因此 PubNub SDK 不会将其从监听器中删除。

相反,你应该在第一个 useEffect 中做这样的事情:

//adding the pubnub listeners on mount
useEffect(() => {
  const listener = { // <-- extract the listener
    message: (message) => {
      if (message) {
        addMessage((messages) => [...messages, message]);
        console.log(message.message);
      }
      scrollingComponent.current.scrollIntoView({ behavior: "smooth" });
    },
    file: handleFile,
  }
  

  pubnub.addListener(listener); // <-- pass the listener here

  pubnub.subscribe({ channels: [chatRoom] });
  
  return function cleanup() {
    pubnub.removeListener(listener); // <-- pass the same listener here

    pubnub.unsubscribeAll();
    addMessage([]);
  };
}, [chatRoom]);

关于javascript - react Pubnub 聊天。消息重复或根本没有消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68408713/

相关文章:

java - 想学Android开发,不懂Java

javascript - Google map API 在 safari 下无法正常工作

javascript - 是否有针对另一个对象的简单 Javascript 命令?

javascript - 确定变量是 ES2015 Map 还是普通的旧 JavaScript 对象

reactjs - 在 React App 中添加对 IconProps 的函数引用

iphone - 使用按钮iPhone SDK进行简单的声音播放

java - Android SDK 管理器无法打开

javascript - 表单提交knout js时checkbox表单字段名未提交

javascript - Reactjs - 使用 xlsx.utils.json_to_sheet 导出到 Excel

javascript - map 未定义 React JS