我是自己准备一个 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) } }
SocketTask设计缺陷:先链接,再订阅。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()里
2023-08-16