微信小程序实现流式传输(打字机效果)

news/2025/9/26 21:27:21/文章来源:https://www.cnblogs.com/Fooo/p/19114280

微信小程序实现流式传输(打字机效果)

Posted on 2025-09-26 21:23  且行且思  阅读(0)  评论(0)    收藏  举报

最近公司在做一款小程序,其中最主要业务的体现方式就是“与AI对话”,那一定是绕不过有着打字机效果的流式传输了。

什么是流式传输?

在解决问题之前,我们需要了解什么是流式传输。流式传输指的是将数据分成多个数据流,通过网络传输,以减少网络延迟和提高性能。在某些情况下,流式传输也可以用于将视频流和音频流传输到客户端。流式传输是一种高效的数据传输方式,常用于大文件下载和在线视频播放等。

解决方案

微信小程序请求不支持接受stream流

开始时尝试在wx.request方法请求体中加入responseType: 'stream'等方法进行实现,发现在 success 回调中返回的是最后的完整结果,而不是实时返回的,显然这种方法不行~

真正的可行方案:onChunkReceived

微信官方文档中提到,wx.request中支持onChunkReceived分段式传输,在小程序中发起请求时,开启 enableChunked,并监听onChunkReceived的回调,逐步处理接收到的数据块,并将处理好的字符串逐步加入到数据中。这种方式有效地应对了微信小程序请求不支持stream流的问题。


代码实现

const requestTask = wx.request({url: 'xxx',method: 'GET',responseType: "arraybuffer",enableChunked: true, //关键!开启流式传输模式
    header: {'content-type': 'application/json',},data: {"prompt": '我梦见了一只金毛抢我的篮球',},success: (res) => {console.log("结束----request success", res);},fail: (err) => {console.log("request fail", err);},
});
// 监听请求头接受事件
requestTask.onHeadersReceived(r => {
});// 监听数据分块接收事件
requestTask.onChunkReceived((response) => {console.log('response',response)// 收到流式数据,根据返回值进行相对应数据解码let data16 = app.buf2hex(response.data)let responseText = app.hexToStr(data16)// 将处理好的字符串加入到数据中this.setData({text: this.data.text + responseText})
});

要点1: 将enableChunked设置为true

要点2: 监听onChunkReceived的回调

要点

通过在请求中设置enableChunked: true和监听onChunkReceived回调,解决了微信小程序中不支持stream流的流式传输问题。

以上,就解决了我们的流式传输问题。


 
解码时用到的两个方法
/**
* 将 ArrayBuffer 转换为十六进制字符串
* @param {ArrayBuffer} buffer - 待转换的 ArrayBuffer
* @returns {string} - 转换后的十六进制字符串
*/
buf2hex(buffer) {return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
},/**
* 将十六进制字符串转换为普通字符串
* @param {string} hex - 十六进制字符串
* @returns {string} - 转换后的普通字符串
*/
hexToStr(hex) {let str = '';for (let i = 0; i < hex.length; i += 2) {str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));}return str;
}

 

 

 

通过开启enableChunked并监听onChunkReceived回调,我们可以逐步处理接收到的数据块,并将其整合到最终的数据中。

值得注意的是,在使用uniapp框架时,应选用wx.request而非uni.request。因为uni.request在处理流式数据时可能存在问题,而wx.request则能更好地应对这种情况。

f636afc379310a55d7e9626eff3a86a6802610ed

△ 数据处理关键函数解析

在实现流式传输的过程中,数据处理函数扮演着至关重要的角色。这些函数负责接收、整合并处理从服务器分段传输过来的数据块,最终将其组合成完整的数据。在微信小程序中,我们可以通过wx.request的enableChunked选项和onChunkReceived回调函数来灵活处理这些数据块,从而实现高效的流式传输。

e7cd7b899e510fb3c0904865914c0d9ad3430cc1

△ 辅助函数

在数据处理的过程中,除了核心的传输与处理函数外,还有一些辅助函数发挥着不可或缺的作用。这些辅助函数可能用于数据的预处理、格式转换、错误检测等,它们与关键函数协同工作,确保数据处理的流畅与准确。

10dfa9ec8a1363274aca01f5d9f065e309fac764

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9月25日(日记里有)

今天上的体育是篮球,今天的基础训练让我重新记起来了部分的篮球的技巧,手感也回来了部分/

建设银行网站维修图片虚拟主机代理商的网站打不开了怎么办

随着互联网的发展&#xff0c;Web1.0、Web2.0 和 Web3.0 成为了人们口中津津乐道的话题。那么&#xff0c;这三种网络时代究竟有什么区别呢&#xff1f; Web1.0 是一个只读的时代&#xff0c;那个时候&#xff0c;用户只能浏览网页&#xff0c;无法进行互动和创作。Web2.0 则是…

Git 提交代码前,一定要做的两件事

作为团队开发的一员,Git 的使用习惯直接影响大家的协作效率。分享两个我每次提交代码前必做的事,虽然简单,但能避免很多不必要的麻烦。​ 第一件事是 拉取最新代码,也就是 git pull。很多时候我们本地开发了半天,…

本地调试接口时遇到的跨域问题,十分钟解决

昨天在本地调试前端项目时,调用后端接口突然报了跨域错误,浏览器控制台清一色的 Access-Control-Allow-Origin 提示,一开始以为是后端配置的问题,折腾半天发现其实前端自己就能解决,分享下我的排查和解决过程。​…

从0开始使用LabVIEW处理数据采集卡-概述和新建新建工程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

用 Excel 快速处理接口返回的 JSON 数据

作为前端开发者,有时候需要把接口返回的 JSON 数据整理成表格,方便和产品、测试核对数据。之前我都是手动复制粘贴,一条数据要改半天,后来发现用 Excel 就能快速处理,分享下具体步骤。​ 首先,把接口返回的 JSON…

网站建设的几个阶段商城网站不易优化

cf1552F. Telepanting 题意&#xff1a; 在一个坐标轴上&#xff0c;有n个传送门&#xff0c;格式为&#xff1a;xi,yi,si,可以从xi传送到yi&#xff0c;si表示状态&#xff0c;如果si为0&#xff0c;到位置xi时不会传送&#xff0c;si变为1.如果到达xi时si为1&#xff0c;则…

做设计有哪些好用的素材网站数字化展厅设计方案

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它可能是一棵空树&#xff0c;也可能是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&am…

调度的基本概念

基本概念 先到先服务FIFO 作业的概念 作业:一个具体的任务 用户向系统提交一个作业:用户让操作系统启动一个程序 三个层次 高级调度(作业调度) 按照一定的原则从外村的作业后备队列中挑选一个作业调入内存,并创建…

Overleaf项目文件同步工具: olsync

Hi! 我编写了一个用于Overleaf项目备份的命令行工具olsync, 希望可以帮助你更好的管理你的latex项目以及私有化的Overleaf服务实例.如果喜欢, 请点一个Star, 谢谢olsync 是一个简单的命令行工具,用于将你的 Overleaf …

CF1995D Cases

CF1995D Cases 题意: 给定一个长为 \(n\),字符集大小 \(c=18\) 的字符串,给定一个整数 \(m\) ,你需要求出一个字符集合 \(S\) 满足在原串中每 \(m\) 个字符中至少有一个被包含在集合 \(S\) 中。 其中 \(m\le n\le …

日志| 编辑距离 | 最长有效括号 |

力扣解题思路 动态规划核心思想 :初始化 + 填充 第一次提交 1状态转移: 左上到cur 是 替换(相同则继承左上) 上到cur 是 删除 左到cur 是 添加 2初始化: 第一行=空字符变成目标字符串的次数 第一列=原字符串变成空字…

网站建设毕业设计过程杭州电商网站开发

概述 - QML 和 C++ 集成 QML 旨在通过 C++ 代码轻松扩展。 Qt QML 模块中的类允许从 C++ 加载和操作 QML 对象,并且 QML 引擎与 Qt 元对象系统集成的特性使 C++ 功能可以直接从 QML 调用。 这允许开发使用 QML、JavaScript 和 C++ 代码混合实现的混合应用程序。 集成 QML 和 C…

UniApp ConnectSocket连接websocket - 详解

UniApp ConnectSocket连接websocket - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

《etcd库——键值存储系统》 - 教程

《etcd库——键值存储系统》 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

9/26

9/26今天我学习了英语听说的相关知识,在英语口语上有了进一步的感悟与进步。学习了一些算法相关的网课弥补课上的不足

有一个函数只会返回0和1,且返回0和返回1的概率不等。要求只能通过这个函数生成一个等概率返回0和1的函数

有一个函数只会返回0和1,且返回0和返回1的概率不等。要求只能通过这个函数生成一个等概率返回0和1的函数题目分析这个函数只会生成0和1,虽然不等概率,但是如果我们roll两次,只记录结果是(0,1)和(1,0)的这两种情况。…

AI智能体开发实战:17种核心架构模式详解与Python代码实现

在构建一个大规模 AI 系统时,我们其实就是在把不同的“智能体设计模式(agentic design patterns)”组合起来。不管系统多复杂都可以拆解成有限的几种"设计模式"。这些模式各有各的用法——有的专门负责思…

代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、删除字符串中的所有相邻重复项

都很简单不赘述type MyQueue struct {StackinTop intStackOutTop intStackIn []intStackOut []int }func Constructor() MyQueue {StackIn := make([]int,0)StackOut := make([]int,0)return MyQueue{StackinTop: 0,St…

文书写作网站百度收录查询api

精讲部分&#xff0c;主要是对Transformer的深度理解方便日后从底层逻辑进行创新&#xff0c;对于仅应用需求的小伙伴可以跳过这一部分&#xff0c;不影响正常学习。 1. 残差模块 何凯明在2015年提出的残差网络&#xff08;ResNet&#xff09;&#xff0c;Transformer在2016年…