sendSocketMessage: fail taskID not exist
发布于 5 年前 作者 humin 6077 次浏览 来自 问答

//创建连接

if (!this._socketTask || this._socketTask.readyState!=1) {

  this._socketTask = wx.connectSocket({
    url: option.url,
    header: {
      ...option.header,
      'content-type': 'application/json'
    },
    method: 'GET',
    fail: function(res){
      self._isLogin = false
      self.reConnect()
    }
  }) 
}
sendHeartBreakMsg() {
    let self = this

    try{

     //wx.sendSocketMessage ({})使用sendSocketMessage 同样会出现

      self._socketTask.send({
        data: 'HB_'+wx.getStorageSync('loginInfo').token,
        success: (e) => {
          // console.log('HB')
        },
        fail: (res) => {
          console.log(res, self._socketTask, self._options, self._socketTask.readyState)
          if (self._socketTask && self._socketTask.readyState != 1) {
            self.reConnect()
          } else if(!self._socketTask) {
            self.createConnection()
          }
        }
      })
    }catch(e){
      console.log(e)
    }
  }

错误日志已上传2019-05-21

正常connectSocket创建连接,测试使用两种方法发送message:sendSocketMessage / socketTask.send 发送。 一切在3-5分钟内是好的。切到后台,回到微信连天页面,再切回小程序,消息还是正常发送。操作3-5分钟后,发送消息就会报 sendSocketMessage: fail 。taskID not exist。此时websocket是连通的,readystate是open状态。我就想问一下这个报错是什么意思?导致sendSocketMessage一直报错。只有关闭微信重开才可以解决。kill吊销程序重启才能解决。 手机:iphoneXr IOS 12.2

微信版本: 7.0.4

基础库版本:2.7.0



6 回复

同样遇到,表现是成功链接以后,如果遇到断网。

第一个是 Ios会同时触发onClose和onError,安卓则只触发onClose

第二个是 进行重连的时候,安卓端表现正常,旧的websoket会被清除,而Ios则不会,Ios只会显示「taskId not exist」

第三个是 进行重连的时候,如果还是没有网络,安卓端只会触发onError,而Ios则会触发onClose和onError…

导致Ios端无限触发onClose,指数增长,创建无数实例

很明显就是两端表现不同步,Ios端逻辑有错误,或者安卓端没完整

解决办法是

第一个是,限制重连次数,避免无限创建实例

第二个是,加上链接成功的标识,保证链接成功后,onClose的只会触发一次

这个巨坑,其实是这样的,小程序websocket在连接超时或者网络切换(4g切换3g,3g切换2g)的时候,webscokt的回调函数存在异常。测试下来发现小程序websocket会先走onerror回调,wss协议这时候会关闭该连接,导致taskID已经被清空,但是后面又回回调onopen这个生命周期,此时readystate变为1。解决方案目前想到的就是强制重连,也希望微信官方能早日修复该bug

我这边测试表现是:从菜单栏打开小程序,socket正常,从服务号点击进入,readyState一直显示是0,想强制关闭后重新创建socket,结果close失败,显示closeSocket:fail:taskId not exist;如果忽略关闭失败,即便重连,状态依旧不会变成1,只能让用户重启小程序才行。

这里看日志是 切后台一段时间以后 socket就被关闭了

可以监听socket的close事件,然后重新创建socket

taskID not exist 是什么原因报错

回到顶部