收藏
回答

小程序什么时候能支持EventSource

我想提一个需求,目前主流浏览器很多都支持HTML5 的EventSource(SSE),小程序什么时候能兼容这个API?相比需要单独搭建websocket服务,SSE有着先天的优势,特别在一些临时性的短场景中尤为轻便,例如A向B扫码,如果A扫码成功了,B就自动弹出提示,这样的场景用websocket显得大材小用。


或者上述场景有其他更好的解决方案么,求解答。

回答关注问题邀请回答
收藏

13 个回答

  • 心情
    心情
    2023-03-22

    顶一下! 什么时候支持一下 我真的服了!!

    2023-03-22
    有用 1
    回复
  • 詹光成
    詹光成
    2023-11-08

    可以使用wx.request自己实现一个

    export default class EventSource {
      constructor(url, retryTime = 0) {
        this.url = url;
        this.retryTime = retryTime;
        this.listeners = {};
        this.requestTask = null;
        this.connect()
      }
    
      connect() {
        this.requestTask = wx.request({
          url: this.url,
          enableChunked: true,
          responseType: 'text',
          method: 'GET',
          timeout: 300e3,
          success: res => {
            this.emit('success', res)
            if (this.retryTime > 0) {
              setTimeout(() => {
                this.connect()
              }, this.retryTime)
            }
          },
          fail: () => {
          }
        });
        this.requestTask.onHeadersReceived(res => {
          this.emit('open', res);
        })
        this.requestTask.onChunkReceived(res => this.handleChunk(res))
      }
    
      handleChunk(res) {
        const arrayBuffer = res.data;
        const uint8Array = new Uint8Array(arrayBuffer);
        let data = uni.arrayBufferToBase64(uint8Array)
        data = new Buffer(data, 'base64')
        data = data.toString('utf8');
        const eventData = this.parseEventData(data);
        this.emit(eventData.event, {data: eventData.data});
      }
      parseEventData(data) {
        const lines = data.split('\n');
        const result = {};
        lines.forEach(line => {
          const [key, value] = line.trim().split(':');
          if (key === 'data') {
            const data = line.substring(5).trim();
            try {
              result[key] = JSON.parse(data);
            } catch(e) {
              result[key] = data;
            }
          } else {
            result[key] = value;
          }
        });
        if (!result.event) {
          result.event = 'message'
        }
        return result;
      }
    
      addEventListener(event, callback) {
        if (!this.listeners[event]) {
          this.listeners[event] = [];
        }
        this.listeners[event].push(callback);
      }
    
      emit(event, data) {
        if (this.listeners[event]) {
          this.listeners[event].forEach(callback => {
            callback(data);
          });
        }
      }
    
      close() {
        if (this.requestTask) {
          this.requestTask.abort();
        }
      }
    }
    
    // 使用方法
    const eventSource = new EventSource('https://domain.com/test.php');
    eventSource.addEventListener('message', res => {
        console.log('message', res)
    })
    


    2023-11-08
    有用
    回复 2
    • 逸海🐇
      逸海🐇
      01-21
      好用吗?这是完整代码不
      01-21
      回复
    • 善良的黄大仙
      善良的黄大仙
      01-23
      有办法主动断开http会话吗
      01-23
      回复
  • 城乡结合部
    城乡结合部
    2023-06-19

    官方赶紧适配啊

    2023-06-19
    有用
    回复
  • 布拉克哈特
    布拉克哈特
    2023-03-22

    凑,啥也不是

    2023-03-22
    有用
    回复
  • wodiao
    wodiao
    2023-03-15

    吊玩意,都几年了。

    2023-03-15
    有用
    回复 2
    • 听风吹
      听风吹
      2023-03-16
      能行了吗
      2023-03-16
      回复
    • wodiao
      wodiao
      2023-03-18回复听风吹
      不可以
      2023-03-18
      回复
  • Dante
    Dante
    2023-03-12

    又过去五年了,应该是没戏了,有没有其他解决方式呢

    2023-03-12
    有用
    回复
  • Stop And Go
    Stop And Go
    2023-03-08

    我靠,两年了,还没兼容进来

    2023-03-08
    有用
    回复
  • 宋雨
    宋雨
    2022-03-19

    +1

    2022-03-19
    有用
    回复
  • 老狼
    老狼
    2020-11-06

    求官方实现

    2020-11-06
    有用
    回复
  • 近近¿
    近近¿
    2020-07-01

    同意


    2020-07-01
    有用
    回复

正在加载...

登录 后发表内容