现在有一个需求,要使用 websocket 传输数据,时间大概几秒钟。
想在传输数据的时候,同时装备下一份数据。准备的时候,也大概几秒钟。
所以,就在想,能否把这两块并行起来。
初步想法 /方法,就是用 Promise.all ,但貌似代码不是很好写。
因为 websocket 的调用,什么 onmessage 等等,不太好放入到 promise 里面去。
有没有兄弟知道怎么做?或者有其它更好的方法?比如 multi-threads?
谢谢。
p.s. JavaScript/TypeScript 前端
1
Jirajine 2020-08-26 22:34:18 +08:00 via Android
|
2
jiangzm 2020-08-26 22:51:47 +08:00
你弄个发送队列不就好了,ws 从队列拿数据发送,组装的数据不断扔到队列。
后面你要封装 Promise 是要干嘛,没看懂, 可以贴了伪代码示例一下。 |
3
fivge 2020-08-27 09:03:29 +08:00
rxjs
|
4
yazoox OP @jiangzm #2 不太好贴。legacy 的项目,一大堆代码全挤在一起。
基本流程就是先传输文件过去,传输完了,如果成功,再传输证书。即,onmessage 里面,收到成功的回复后,再发送证书。 但大家知道,申请证书,调用 api 也是需要时间的。 所以,想在发送文件时,异步调用函数申请证书。等收到文件传输成功消息 /响应后,就能直接发送证书了。 |
5
yazoox OP |
6
azcvcza 2020-08-27 10:02:55 +08:00
```
onmessage = function(data){ if(data.type === '某种类型'){ new Promise(resolve=>{ resolve(axios.post('xxx')) }).then(res=>{ // get auth websocket.send() }) } } ``` 大致逻辑这样? |
7
peterjose 2020-08-27 10:46:19 +08:00
没太听懂你在说啥 但是 rxjs-websocket 估计能满足你
|
8
libook 2020-08-27 11:13:16 +08:00
没有代码,没法提供方案。
数据量不大到至于爆掉引擎内存空间的话,可以准备两个线程(比如 Web Workers )、一个队列,一个线程持续准备数据并将待发送的数据插入到队列中,另一个线程不断从队列中读取数据发送。如果你用内存存储队列且怕内存爆掉,可以在准备数据的过程里每次循环都检查一下队列大小,如果超出阈值就暂停一段时间。 Promise 是在一个线程内控制异步 IO 的,Promise.all 不知道你想怎么用,如果单纯吧准备和发送数据的过程扔到里面估计是所有要处理的数据同时准备和发送了,你要是对数据没有先后顺序要求的话也不是不行。Promise 提升效率的关键在于异步 API 异步执行,同步 API 用了 Promise 也不会异步执行,这时候就得考虑多线程了。 |
9
hitaoguo 2020-08-27 11:24:45 +08:00
// 把传输文件封装成一个 Promise
const sendFile = () => Promise.resolve() // 申请证书也封装一下 const requestCert = () => Promise.resolve() const sendCert = () => { } // 最后通过 Promise.All ,当文件传输好了,并且证书也申请下来了的时候,再发送证书 Promise.all([sendFile(), requestCert()]).then(sendCert) |
10
qyvlik 2020-08-27 15:56:49 +08:00
|
11
jiangzm 2020-08-28 00:30:10 +08:00
@yazoox #4 这很简单啊,异步发送文件和异步请求证书就行,然后在 onmessage 里面同步等待请求证书的结果
code: https://gist.github.com/jiangzm/4474f2c2f601b23d306235b2233fbe03 preview: <img src="https://s1.ax1x.com/2020/08/28/d5rJOg.png" alt="d5rJOg.png" border="0" /> |
12
jiangzm 2020-08-28 00:34:50 +08:00
|
13
jiangzm 2020-08-28 00:35:50 +08:00
|
14
yazoox OP |