1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| h5PostStream(url, data) { let controller = null; let onChunkCallback = null; let onErrorCallback = null; let onCompleteCallback = null;
const streamTask = { // 设置数据块接收回调 onChunkReceived(callback) { onChunkCallback = callback; },
// 设置错误回调 onError(callback) { onErrorCallback = callback; },
// 设置完成回调 onComplete(callback) { onCompleteCallback = callback; },
// 中止请求 abort() { if (controller) { controller.abort(); } }, };
// 启动 SSE 连接 setTimeout(() => { controller = new AbortController();
fetchEventSource(baseurl + url, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: getToken(), Accept: 'text/event-stream', }, body: JSON.stringify(data), signal: controller.signal,
// 当连接打开时 onopen(response) { if (response.ok) { console.log('SSE 连接已建立'); return; }
// 处理错误状态码 if (response.status === 401 || response.status === 403) { throw new Error('认证失败'); }
throw new Error('连接失败: ' + response.status); },
// 当收到消息时 onmessage(event) { if (onChunkCallback && event.data) { // 将字符串转换为 ArrayBuffer (模拟 uni.request 的返回格式) const encoder = new TextEncoder(); const arrayBuffer = encoder.encode(event.data).buffer;
onChunkCallback({ data: arrayBuffer, }); } },
// 当发生错误时 onerror(err) { console.error('SSE 错误:', err);
// 检查是否是认证错误 if (err.message && err.message.includes('认证失败')) { useDialog('登录过期,请前往登录', { title: '提示', showCancelButton: true }) .then(() => { uni.navigateTo({ url: '/pages/login/phone/index', }); }) .catch(err => {}); }
if (onErrorCallback) { onErrorCallback(err); }
// 抛出错误以停止重连 throw err; },
// 当连接关闭时 onclose() { console.log('SSE 连接已关闭'); if (onCompleteCallback) { onCompleteCallback(); } },
// 不自动重连 openWhenHidden: false, }); }, 0);
return streamTask; },
|