微信小程序websocket重复进入页面,onmessage重复执行?
发布于 7 年前 作者 tangyong 13861 次浏览 来自 问答

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

2 回复

我觉得你可能思路有问题,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;
  }
})

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

回到顶部