当前位置:   article > 正文

分享一个让 uniapp 微信小程序支持 EventSource 的方法_uniapp eventsource

uniapp eventsource

微信小程序不支持

EventSource(SSE)是一种HTML5标准,旨在提供一种方式来在Web应用中实现异步通信和事件处理。

然而,根据现有的信息,uni-app并没有直接支持EventSource,这意味着开发者需要寻找其他技术或替代方案来实现类似的效果。

尽管有些主流浏览器支持SSE,但小程序目前还不能兼容这个API,这可能是由于微信平台对新技术的兼容性考虑或是开发生态的限制。

一个替代实现方式

  1. class EventSource {
  2. constructor(url, retryTime = 0) {
  3. this.url = url;
  4. this.retryTime = retryTime;
  5. this.listeners = {};
  6. this.requestTask = null
  7. this.connect()
  8. }
  9. connect() {
  10. this.requestTask = wx.request({
  11. url: this.url,
  12. enableChunked: true,
  13. responseType: 'text',
  14. method: 'GET',
  15. timeout: 300e3,
  16. success: res => {
  17. this.emit('success', res)
  18. if (this.retryTime > 0) {
  19. setTimeout(() => {
  20. this.connect()
  21. }, this.retryTime)
  22. }
  23. },
  24. fail: () => {
  25. }
  26. });
  27. this.requestTask.onHeadersReceived(res => {
  28. this.emit('open', res);
  29. })
  30. this.requestTask.onChunkReceived(res => this.handleChunk(res))
  31. }
  32. handleChunk(res) {
  33. const arrayBuffer = res.data;
  34. const uint8Array = new Uint8Array(arrayBuffer);
  35. let data = uni.arrayBufferToBase64(uint8Array)
  36. data = new Buffer(data, 'base64')
  37. data = data.toString('utf8')
  38. const lines = data.split("\n\n")
  39. // console.log('data', data, lines)
  40. lines.forEach(line => {
  41. if (!line.trim()) {
  42. return
  43. }
  44. const [key, value] = line.trim().split(':');
  45. if (key === 'data') {
  46. const data = line.substring(5).trim();
  47. try {
  48. const json = JSON.parse(data);
  49. this.emit('message', {
  50. data: JSON.stringify(json)
  51. })
  52. } catch (e) {
  53. this.emit('error', 'Api.EventSource.ParseError:' + e)
  54. }
  55. } else {
  56. this.emit('error', 'Api.EventSource.ParseFail:' + line)
  57. }
  58. })
  59. }
  60. addEventListener(event, callback) {
  61. if (!this.listeners[event]) {
  62. this.listeners[event] = []
  63. }
  64. this.listeners[event].push(callback)
  65. }
  66. emit(event, data) {
  67. if (this.listeners[event]) {
  68. this.listeners[event].forEach(callback => {
  69. callback(data)
  70. });
  71. }
  72. }
  73. close() {
  74. if (this.requestTask) {
  75. this.requestTask.abort()
  76. }
  77. }
  78. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/378463
推荐阅读
相关标签
  

闽ICP备14008679号