收藏
回答

SocketTask设计缺陷:先链接,再订阅。

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug SocketTask 工具 最新 2.10.4

SocketTask设计有很大问题,

api写法入下:

let task = wx.connectSocket();
task.onOpen(()=>{ console.log('链接成功!') });

问题:onOpen事件的订阅在链接之后进行,会概率性导致:先链接成功再订阅事件的问题(无法触发onOpen事件)。

我检查了所有api,没找到合适对处理方式,希望能给予解答。

理论上api应如下:

// 解决方案一:connectSocket不自动链接,并提供“connection()”方法。
let task = wx.connectSocket(); // 这里不应该自动发起链接,只创建SocketTask对象即可。
task.onOpen(()=>{ console.log('链接成功!') }); // 订阅
task.connection(); // 开始链接(没有这个api)

// 解决方案二:事件的订阅写在wx.connectSocket()里
回答关注问题邀请回答
收藏

7 个回答

  • 瞧
    2021-04-09
    连接socket 是异步的,不可能早于 onOpen的回调注册
    

    2021-04-09
    有用 1
    回复 1
    • 平安喜乐
      平安喜乐
      04-13
      对,题主是不是想多了。从事件循环来看,注册也是在前的
      04-13
      回复
  • 周季
    周季
    2023-08-16

    我是自己准备一个 promise,在 success 里 resolve 掉这个 promise,在 wx.connectSocket() 之后等待 promise。

    const succeed = new Deferred()
    const socketTask = wx.connectSocket({
      // ...
      success(res => succeed.resolve(res)),
      // ...
    })
    succeed.then(_ => {
      socketTask.onOpen(...)
    })
    


    只是个思路哈,我实际代码其实是对有类似行为方法的一般性封装,验证了没问题,但上边贴的这段不排除有 bug。

    Deferred 是自定义的,一时间没找到现成的(类名是我起的,但类里面的全部代码都是 AI 自动生成的):

    class Deferred {
      constructor() {
        this.promise = new Promise((resolve, reject) => {
          this.resolve = resolve
          this.reject = reject
        })
        this.then = this.promise.then.bind(this.promise)
        this.catch = this.promise.catch.bind(this.promise)
        this.finally = this.promise.finally.bind(this.promise)
      }
    }
    


    2023-08-16
    有用
    回复
  • 含光
    含光
    2021-06-07

    坐等更新

    2021-06-07
    有用
    回复
  • 念头通达
    念头通达
    2021-04-09
    可以直接把订阅写在wx.connectSocket()的success 方法里边
    


    2021-04-09
    有用
    回复 1
    • Steve Gan
      Steve Gan
      2022-10-13
      请问该怎么写,success里不是还没有SocketTask实例吗?
      2022-10-13
      回复
  • 👑        왕
    👑 왕
    2021-03-31

    同意,概率不是一般的大,遇到过很多次了.

    而且还有一个问题是SocketTask不支持重连

    如果掉线了,要整个释放掉,不能重连!!!!

    2021-03-31
    有用
    回复
  • 乔不见
    乔不见
    2021-03-08

    等后续情况

    2021-03-08
    有用
    回复
  • Jacob
    Jacob
    2020-12-22

    插个眼

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