惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cloudbric
Cloudbric
V
Visual Studio Blog
L
LangChain Blog
A
About on SuperTechFans
B
Blog
T
Tenable Blog
罗磊的独立博客
Hacker News: Ask HN
Hacker News: Ask HN
Blog — PlanetScale
Blog — PlanetScale
博客园 - 三生石上(FineUI控件)
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Palo Alto Networks Blog
U
Unit 42
WordPress大学
WordPress大学
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
C
Check Point Blog
Security Latest
Security Latest
M
MIT News - Artificial intelligence
Application and Cybersecurity Blog
Application and Cybersecurity Blog
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
S
Securelist
Security Archives - TechRepublic
Security Archives - TechRepublic
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Latest news
Latest news
GbyAI
GbyAI
T
Troy Hunt's Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 热门话题
V2EX - 技术
V2EX - 技术
小众软件
小众软件
Google DeepMind News
Google DeepMind News
K
Kaspersky official blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
Netflix TechBlog - Medium
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed

博客园 - 且行且思

Cesium 加载 3dtiles ,实现球体旋转、模型定位 Tomcat服务自动关闭 , 定时检查并重启 用echarts打造会转的立体饼图 BaseMetas Fileview在线文件预览解决方案 ECharts GL | 3D 地图区域高度设置 物联网智慧平台 蚂蚁地理空间数据可视化 - 基于 WebGL 的开源大规模地理空间数据可视分析引擎。 主流开源JS地图框架选择 kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的开源反爬虫接口防刷组件。 NProgress 给 Vue 路由切换加个 “假” 进度条提升用户体验 一个watch让页面卡成PPT? 只会 !important 改 UI? Vue 深度选择器解法 JAVA 对于class文件反编译,CFR 通常能产生最完整的代码。 用AI辅助设计登录页 免费白嫖Claude 4小技巧 Jmeter压测工具入门篇 性能工具之 JMeter 快速入门 高并发压力测试工具清单 Nginx 单机多实例负载均衡 IntelliJ IDEA 中 Shared Build Process Heap Size 的重要性与配置
微信小程序实现流式传输(打字机效果)
且行且思 · 2025-09-26 · via 博客园 - 且行且思

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

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

最近公司在做一款小程序,其中最主要业务的体现方式就是“与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