收藏
回答

微信小程序websocket重复进入页面,onmessage重复执行?

我使用es6语法暴露一个连接类,然后app.js实例化该连接类,获取wx.connectsocket接口函数的返回值socketTask,将它存储在全局实例app的connectobj属性中实现所有页面共享一个websocket连接,然后直接在页面中使用connectobj调用onmessage监听消息,重复进入后重复执行这个监听函数,导致收到的消息重复写入,请问有什么解决办法么?能不能通过判断onmessage函数是否在执行来解决?如果可以,怎么判断?感谢大佬指点!

回答关注问题邀请回答
收藏

2 个回答

  • 黯伢zz
    黯伢zz
    2019-12-30

    我觉得你可能思路有问题,onmessage应该只设置一次,一个connectobj本来就一直在并没有销毁,你多设置当然就多次触发了,所以可以把onmessage的设置也放到app中,再用回调触发。

    // 方案一:
    // app.js
    App({
      onLaunch: function () {
        var connectobj = wx.connectSocket({
          url'ws://xxx:xxxx'
        });
        connectobj.onMessage((data) => {
          var pages = getCurrentPages();
          var currentPage = pages[pages.length - 1]; //当前页面
          if (currentPage.onMessage) currentPage.onMessage(data);
        });
      }
    })
    
    // page.js
    page({
      data: {
        sData: {}
      },
    
      onLoad: function () {
    
      },
    
      onMessage: function (data) {
        this.setData({ sData: data });
      }
    })
    
    // 方案二:
    // app.js
    App({
      onLaunch: function () {
        var connectobj = wx.connectSocket({
          url'ws://xxx:xxxx'
        });
        connectobj.onMessage((data) => {
          if (this.onMessage) this.onMessage(data);
        });
      }
    })
    
    // page.js
    const app = getApp();
    page({
      data: {
        sData: {}
      },
    
      onLoad: function () {
        app.onMessage = (data) => {
          this.setData({ sData: data });
        }
      },
    
      onUnloadfunction () {
        app.onMessage = null;
      }
    })
    
    2019-12-30
    有用 7
    回复 2
    • n
      n
      2020-04-11
      非常感谢,帮我解决问题了:)
      2020-04-11
      回复
    • 汉子cc🐘
      汉子cc🐘
      2023-03-21
      页面卸载后,在其他页面就不能继续调用 app.onMessage 了
      2023-03-21
      回复
  • 张斯特洛夫斯基
    张斯特洛夫斯基
    2019-12-31

    感谢大佬,已经按照你的思路成功解决了问题!顺便问一下,如果我在后端将clientid和uid绑定,那么如果下次再绑定,不解绑之前的,是不是就会造成服务端给一个uid发消息会发多次给客户端?

    2019-12-31
    有用
    回复
登录 后发表内容
问题标签