跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个编程技巧,有没有办法把 websocket 的通讯装到 Promise 里面去?
未分類
25 8 月 2020

请教一个编程技巧,有没有办法把 websocket 的通讯装到 Promise 里面去?

请教一个编程技巧,有没有办法把 websocket 的通讯装到 Promise 里面去?

資深大佬 : yazoox 10

现在有一个需求,要使用 websocket 传输数据,时间大概几秒钟。
想在传输数据的时候,同时装备下一份数据。准备的时候,也大概几秒钟。

所以,就在想,能否把这两块并行起来。

初步想法 /方法,就是用 Promise.all ,但貌似代码不是很好写。
因为 websocket 的调用,什么 onmessage 等等,不太好放入到 promise 里面去。

有没有兄弟知道怎么做?或者有其它更好的方法?比如 multi-threads?

谢谢。

p.s. JavaScript/TypeScript 前端

大佬有話說 (14)

  • 資深大佬 : Jirajine

    https://www.npmjs.com/package/async-ws

  • 資深大佬 : jiangzm

    你弄个发送队列不就好了,ws 从队列拿数据发送,组装的数据不断扔到队列。

    后面你要封装 Promise 是要干嘛,没看懂, 可以贴了伪代码示例一下。

  • 資深大佬 : fivge

    rxjs

  • 主 資深大佬 : yazoox

    @jiangzm #2 不太好贴。legacy 的项目,一大堆代码全挤在一起。

    基本流程就是先传输文件过去,传输完了,如果成功,再传输证书。即,onmessage 里面,收到成功的回复后,再发送证书。

    但大家知道,申请证书,调用 api 也是需要时间的。
    所以,想在发送文件时,异步调用函数申请证书。等收到文件传输成功消息 /响应后,就能直接发送证书了。

  • 主 資深大佬 : yazoox

    @jiangzm #2 看懂你的意思了。

    可惜,我们这个逻辑 /流程,当初设计的时候,就有严格的顺序。握手-验证双方身份-发送文件-发送证书-……
    有顺序的。相当于“同步”执行。

  • 資深大佬 : azcvcza

    “`
    onmessage = function(data){
    if(data.type === ‘某种类型’){
    new Promise(resolve=>{
    resolve(axios.post(‘xxx’))
    }).then(res=>{
    // get auth
    websocket.send()
    })
    }
    }
    “`
    大致逻辑这样?

  • 資深大佬 : peterjose

    没太听懂你在说啥 但是 rxjs-websocket 估计能满足你

  • 資深大佬 : libook

    没有代码,没法提供方案。

    数据量不大到至于爆掉引擎内存空间的话,可以准备两个线程(比如 Web Workers )、一个队列,一个线程持续准备数据并将待发送的数据插入到队列中,另一个线程不断从队列中读取数据发送。如果你用内存存储队列且怕内存爆掉,可以在准备数据的过程里每次循环都检查一下队列大小,如果超出阈值就暂停一段时间。

    Promise 是在一个线程内控制异步 IO 的,Promise.all 不知道你想怎么用,如果单纯吧准备和发送数据的过程扔到里面估计是所有要处理的数据同时准备和发送了,你要是对数据没有先后顺序要求的话也不是不行。Promise 提升效率的关键在于异步 API 异步执行,同步 API 用了 Promise 也不会异步执行,这时候就得考虑多线程了。

  • 資深大佬 : hitaoguo

    // 把传输文件封装成一个 Promise
    const sendFile = () => Promise.resolve()
    // 申请证书也封装一下
    const requestCert = () => Promise.resolve()
    const sendCert = () => { }
    // 最后通过 Promise.All ,当文件传输好了,并且证书也申请下来了的时候,再发送证书
    Promise.all([sendFile(), requestCert()]).then(sendCert)

  • 資深大佬 : qyvlik

    试试这个: https://github.com/qyvlik/rpc.js/blob/master/index.js

  • 資深大佬 : jiangzm

    @yazoox #4 这很简单啊,异步发送文件和异步请求证书就行,然后在 onmessage 里面同步等待请求证书的结果
    code: https://gist.github.com/jiangzm/4474f2c2f601b23d306235b2233fbe03

  • 資深大佬 : jiangzm

    换个图库看下
    https://sm.ms/image/mnsAfHc5GzLt4kK

  • 資深大佬 : jiangzm

    原来是链接搞错了
    https://i.loli.net/2020/08/28/mnsAfHc5GzLt4kK.png

  • 主 資深大佬 : yazoox

    @jiangzm
    谢谢。你的这个方法是可以的。
    今天学习到了一招,原来 promise 可以直接 assgin 给一个变量,调用后不管。
    在后面需要的时候,await promise 变量就可以了。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具