From 9eb7782d448988e66f58eccc3cac70bf905b0ba6 Mon Sep 17 00:00:00 2001 From: yanghang Date: Mon, 7 Jul 2025 11:24:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=9C=AA=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/arraybuffer.js | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/api/arraybuffer.js diff --git a/src/api/arraybuffer.js b/src/api/arraybuffer.js new file mode 100644 index 00000000..45a922f2 --- /dev/null +++ b/src/api/arraybuffer.js @@ -0,0 +1,88 @@ + +import { getToken } from '@/common/common.js' +import { get_base_url } from '@/api/request' + +const base_url = get_base_url(); +const token = getToken(); +// 基础配置 +const baseConfig = { + enableChunked: true, // 必须开启分块传输 + responseType: 'arraybuffer', // 微信小程序需用arraybuffer + timeout: 30000 // 超时时间延长 +} + +// 流式请求核心实现 +function streamRequest(options) { + const { + url, + method = 'GET', + data, + headers = {}, + onChunk, + onComplete, + onError + } = options + + headers['Accept'] = 'text/event-stream' + headers['Content-Type'] = 'application/json;charset=UTF-8' + headers['summary'] = token + + // 创建请求任务 + const requestTask = uni.request({ + url, + method, + data, + header: headers, + ...baseConfig, + success: (res) => { + onComplete?.(res) + }, + fail: (err) => { + onError?.(err) + } + }) + console.log(requestTask) + // 流式数据处理器 + let bufferCache = '' + requestTask.onChunkReceived((res) => { + try { + // ArrayBuffer转字符串(兼容多平台) + const uint8Array = new Uint8Array(res.data) + const chunkText = bufferCache + + String.fromCharCode.apply(null, uint8Array) + + // 处理SSE格式数据(data:开头) + const events = chunkText.split('\n\n') + bufferCache = events.pop() || '' // 缓存不完整数据 + + events.forEach(event => { + if (event.startsWith('data:')) { + onChunk?.(event.substring(5).trim()) + } + }) + } catch (e) { + onError?.(e) + } + }) + + return { + abort: () => requestTask.abort() + } +} + +// 使用示例 +export const demoUsage = (data) => { + const controller = streamRequest({ + url: `${base_url}/trastudy/intgask/askAbout`, + data: data, + onChunk: (chunk) => { + console.log('收到数据块:', chunk) + // 实时更新UI逻辑 + }, + onComplete: () => console.log('传输完成'), + onError: (err) => console.error('错误:', err) + }) + + // 需要中断时调用 + // controller.abort() +} \ No newline at end of file