当前位置: 首页 > article >正文

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解

在现代 Web 应用中,异步处理是实现流畅交互的核心技术。本文基于前几章实现的内容Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加-CSDN博客,深入解析 AI 对话框页面中异步逻辑的实现细节,涵盖语音交互、AI 回复模拟、文件处理等场景,并探讨如何通过异步技术提升用户体验与系统性能。

一、异步处理在 AI 对话框中的应用场景

我们构建的 AI 对话框支持以下异步场景:

  1. 语音交互:语音识别与合成通过浏览器 API 异步处理,避免阻塞用户输入。
  2. AI 回复生成模拟后端 API 延迟,通过定时器实现非阻塞响应。
  3. 图片上传预览:使用FileReader异步读取图片文件,避免大文件阻塞主线程。
  4. 动画与状态更新:按钮悬停效果、消息编辑 / 删除的过渡动画,通过 CSS 异步渲染

二、语音交互的异步实现

2.1 语音识别的非阻塞处理

通过 SpeechRecognition API 实现了实时语音转文字功能,核心异步逻辑如下:

// 启动语音识别(异步操作)
recognition.start();// 异步接收识别结果
recognition.onresult = (event) => {let transcript = '';for (let i = 0; i < event.results.length; i++) {transcript += event.results[i][0].transcript;// 如果是最终结果,添加句号if (event.results[i].isFinal) {transcript += '。';}}messageInput.value = transcript; // 实时更新输入框
};// 错误处理(关键异步逻辑)
recognition.onerror = (event) => {if (event.error === 'aborted') {// 用户主动中断,不显示错误console.log('语音识别已中断');} else {// 处理权限、网络等错误console.error('语音识别错误:', event.error);stopListening();alert('语音识别失败,请检查网络或授予麦克风权限');}
};

异步处理优势

  • 实时响应:用户说话时输入框同步更新,无需等待完整语句结束。
  • 错误隔离:即使语音识别失败,应用仍能正常运行,避免崩溃。
  • 用户体验优化:通过 interimResults 参数获取临时识别结果,提升交互流畅度。

2.2 语音合成的状态管理

使用 SpeechSynthesisUtterance 实现语音播报,并通过回调函数管理状态

function speak(text, button = null) {const utterance = new SpeechSynthesisUtterance(text);// 应用语音设置(异步操作)utterance.rate = speechSettings.rate;utterance.pitch = speechSettings.pitch;// 状态更新(异步回调)utterance.onstart = () => {if (button) {button.classList.add('active');button.innerHTML = '<i class="fa fa-pause"></i>';}};utterance.onend = () => {if (button) {button.classList.remove('active');button.innerHTML = '<i class="fa fa-play"></i>';}};synth.speak(utterance); // 非阻塞调用
}

异步处理优势

  • UI 与语音同步:通过 onstart/onend 回调实时更新按钮状态,避免用户误操作。
  • 全局控制:支持暂停、恢复和停止功能,通过 synth.paused 和 synth.speaking 判断状态。

三、图片上传的异步预览

使用 FileReader 实现图片异步读取和预览:

imageInput.addEventListener('change', (e) => {const file = e.target.files[0];if (file) {// 验证图片类型和大小(同步操作)const isImage = file.type.startsWith('image/');if (!isImage || file.size > MAX_IMAGE_SIZE) {alert('请选择小于5MB的图片');return;}// 异步读取文件(关键逻辑)const reader = new FileReader();reader.onload = (event) => {// 生成图片预览(异步渲染)const imagePreview = document.createElement('img');imagePreview.className = 'image-preview';imagePreview.src = event.target.result;// 插入消息并触发AI回复(异步操作)const userMessageHtml = generateMessageHtml(messageInput.value, imagePreview.outerHTML);messageContainer.insertAdjacentHTML('beforeend', userMessageHtml);messageInput.value = '';// 模拟AI回复(异步延迟)setTimeout(() => {addAIResponse("我看到您上传的图片了...");}, 1000);};reader.readAsDataURL(file); // 异步读取}
});

异步处理优势

  • 非阻塞预览:图片读取时用户可继续操作界面,避免大文件导致的卡顿。
  • 错误提前拦截:同步验证文件类型和大小,失败时直接提示,成功则异步处理预览。

四、AI 回复的异步模拟

通过 setTimeout 模拟网络延迟,实现 AI 回复的异步生成:

function sendMessage(text) {if (!text) return;// 立即显示用户消息(同步操作)const userMessageHtml = generateUserMessageHtml(text);messageContainer.insertAdjacentHTML('beforeend', userMessageHtml);messageInput.value = '';// 显示“正在输入”动画(异步渲染)showTypingIndicator();// 模拟网络延迟(异步操作)setTimeout(() => {const aiResponse = generateAIResponse(text);addAIResponse(aiResponse); // 异步添加AI回复removeTypingIndicator();}, 1000 + Math.random() * 1000);
}

异步处理优势

  • 感知流畅性:用户发送消息后立即看到自己的内容,减少等待焦虑。
  • 真实网络模拟:通过随机延迟(1-2 秒)模拟真实 API 响应时间,避免 UI 假死。

五、消息操作的异步动画

使用 CSS 过渡和 JavaScript 事件实现按钮悬停效果:

<div class="absolute top-2 right-2 flex gap-1 opacity-0 transition-opacity duration-200 group-hover:opacity-100"><button class="copy-button p-1.5 bg-white/10 hover:bg-white/20 text-gray-700 hover:text-white rounded-md shadow-sm transform hover:scale-105 transition-all duration-200 flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M21 3.5V17a2 2 0 0 1-2 2h-2v-2h2V3.5H9v2h5.857c1.184 0 2.143.895 2.143 2v13c0 1.105-.96 2-2.143 2H5.143C3.959 22.5 3 21.605 3 20.5v-13c0-1.105.96-2 2.143-2H7v-2a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2m-6.143 4H5.143v13h9.714z" clip-rule="evenodd"></path></svg><span class="hide sm:inline">复制</span></button>
<!--    编辑、删除按钮   -->
</div>

异步处理优势

  • 资源优化:操作按钮仅在鼠标悬停时显示,减少初始渲染负担。
  • 视觉反馈:通过 opacity-0 到 opacity-100 的过渡动画,提升交互体验。

六、总结:异步处理的核心价值

  1. 流畅性:所有耗时操作(语音、图片、网络)均在后台处理,UI 保持 60fps。
  2. 响应性:用户操作即时反馈(如按钮状态切换),避免 “假死” 现象。
  3. 容错性:通过 onerror 回调处理异常,提供友好提示而非崩溃。
  4. 资源优化:异步加载减少初始渲染时间,提升首屏性能。

相关文章:

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解

在现代 Web 应用中&#xff0c;异步处理是实现流畅交互的核心技术。本文基于前几章实现的内容Tailwind CSS 实战&#xff1a;基于 Kooboo 构建 AI 对话框页面&#xff08;七&#xff09;&#xff1a;消息框交互功能添加-CSDN博客&#xff0c;深入解析 AI 对话框页面中异步逻辑的…...

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

文章目录 前言:准备工作UE4 vs UE5 性能对比引擎核心技术方案对比UE5 优化总结项目设置可伸缩性组设置VolumetricCloud最后前言: 最近在使用UE5制作VR项目 制作完后发现,我们的场景一直很卡顿,场景优化也做到了极致,但是帧率最高也才30+ 但是我们看到一个竞品,他的帧率竟…...

COMSOL与MATLAB联合仿真人工智能的电学层析成像系统

关键词&#xff1a;MATLAB&#xff0c;电学层析成像&#xff0c;人工智能&#xff0c;图像重建&#xff0c;深度学习 一、引言 基于人工智能的电学层析成像系统是一种创新的检测技术&#xff0c;结合了电学层析成像技术与人工智能算法的优势。电学层析成像技术&#xff0c;简…...

配置sudo免密却不生效的问题

如图&#xff0c;我配置了dhcp4这个账号sudo免密&#xff0c;但是执行sudo的时候还是要输密码。 查看dhcp的用户组&#xff0c;是配置了一个wheel组&#xff0c;而wheel组配置的是需要密码。 我们用dhcp4用户执行sudo -l 发下他匹配了两条命令策略&#xff0c;一个是免密一个…...

大模型赋能:金融智能革命中的特征工程新纪元

一、AI进化论&#xff1a;从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面&#xff1a;银行风控模型像老式收音机&#xff0c;需要人工反复调试参数才能捕捉风险信号&#xff1b;而大模型则是智能调音台&#xff0c;能自动“听…...

Significant Location Change

一、Significant Location Change是什么 “Significant Location Change&#xff08;重大位置变化&#xff09;” 是苹果 iOS 系统中一项用于在应用未主动运行时&#xff0c;监测设备位置显著变化的功能。它主要通过基站、Wi-Fi 网络等信号来判断设备是否发生了有意义的位置移…...

springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试

我们在java项目开发中&#xff0c;如何设置服务器最大负载&#xff0c;过了服务器承受范围之后&#xff0c;提示用户稍后重试&#xff0c;避免 服务器无法提供正常服务 如何设置服务器负载比如&#xff1a;最大线程数&#xff0c;等待数量等,请看&#xff1a;springtomcat 用户…...

LHA9924芯片可代替AD7190,CS5530

LHA9924是一款高性能、单芯片模数转换器(ADC)。该器件包括一个低噪声可编程增益放大器(PGA)、Δ-Σ调制器和数字滤波器。该ADC支持两种运行模式&#xff0c;可在功耗与分辨率之间实现最佳平衡。双通道多路复用器可以选择外部信号测量和内部ADC测试信号。具有使输入电路短路来测…...

短视频矩阵系统技术saas源头6年开发构架

在短视频内容爆发式增长的今天&#xff0c;短视频矩阵系统SAAS技术成为企业快速搭建视频平台的关键解决方案。本文将系统解析从技术源头到服务落地的全流程开发路径。 一、系统定义与技术基础 短视频矩阵系统是集视频上传、智能编辑、多端分享、高清播放于一体的综合性平台。其…...

枫之谷Artale端午节大当机----后端技术的巨大风险

枫之谷Artale在端午节活动造成大量玩家上线塞爆&#xff0c;进不去&#xff0c;甚至在最后时段大当机&#xff0c;造成数万玩家怒火。 这体现了后端技术的影响&#xff0c;它不像是前端技术只对少数人造成影响&#xff0c;只要一出事&#xff0c;就是大批的玩家一起面对崩溃的伺…...

前端删除评论操作(局部更新数组)

​评论的删除是局部删除&#xff0c;把所点击的评论id号传递给后端&#xff0c;通知后端在数据库中删除数据&#xff0c;并且返回数据&#xff0c;但是在前端并不直接接收返回的数据&#xff0c;而是触发回调事件&#xff0c;在前端上进行删除评论&#xff0c;首先通过pId观察他…...

数学复习笔记 28

前言 刷数学题非常爽啊。让我感觉自己能考一百四&#xff0c;一百五这种错觉。我和一个朋友说&#xff0c;我肯定能考一百四以上&#xff0c;他说他觉得我最多考一百二&#xff0c;笑死&#xff0c;我是这么菜的么。下面是线代第六章的例题的一些理解。我现在觉得考研数学不需…...

Delphi 实现远程连接 Access 数据库的指南

方法一&#xff1a;通过局域网共享 Access 文件&#xff08;简单但有限&#xff09; 步骤 1&#xff1a;共享 Access 数据库 将 .mdb 或 .accdb 文件放在局域网内某台电脑的共享文件夹中。 右键文件夹 → 属性 → 共享 → 启用共享并设置权限&#xff08;需允许网络用户读写&a…...

在线OJ项目测试

一.项目简介 1.1项目背景 历史起源&#xff1a;最早的OJ系统&#xff08;如UVa、POJ&#xff09;是为国际大学生程序设计竞赛&#xff08;ICPC&#xff09;等赛事开发的&#xff0c;用于自动评判参赛者的代码正确性和效率。 需求场景&#xff1a;竞赛需要公平、高效的评分系统…...

C++ --- vector

C --- vector的使用 前言1、构造函数1.1默认构造1.2n个val值构造1.3迭代器区间构造1.4拷贝构造1.4初始化列表构造 2、遍历方式2.1[ ] 下标2.2迭代器2.3范围for 3、常用方法或重载&#xff08;1&#xff09;增push_back()insert()assign() &#xff08;2&#xff09;删erase()c…...

【python基础知识】变量名和方法名的单下划线(_)和双下划线(__)总结

文章目录 1. 单下划线前缀&#xff08;_variable 或 _method()&#xff09;2. 双下划线前缀&#xff08;__variable 或 __method()&#xff09;3. 前后双下划线&#xff08;__variable__ 或 __method__&#xff09;4. 单下划线&#xff08;_&#xff09;单独使用总结 在 Python…...

FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ FART 脱壳 fartthread 方法在 app 启动的时候&#xff08;ActivityThread&#xff09;开启 fart 线程&#xff0c;休眠 60 秒&#xff0c;等待 app 启动完成后…...

✅ 常用 Java HTTP 客户端汇总及使用示例

在 Java 开发中&#xff0c;HTTP 客户端是与服务端交互的关键组件。随着技术发展&#xff0c;出现了多种 HTTP 客户端库&#xff0c;本文汇总了常用的 Java HTTP 客户端&#xff0c;介绍其特点、适用场景&#xff0c;并附上简单使用示例&#xff0c;方便开发者快速选择和上手。…...

快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令

目录 1. uv 介绍2. uv 安装&#xff08;Windows版&#xff09;3. 快速模拟一个要发布到TestPyPI上的依赖包&#xff0c;scoful-test-lib3.1 初始化 uv init3.2 进入scoful-test-lib3.3 修改pyproject.toml3.4 使用命令 uv sync3.5. 使用命令 uv lock3.6 使用命令 uv build3.7 获…...

Keil调试模式下,排查程序崩溃简述

在Keil调试模式下&#xff0c;若程序崩溃&#xff0c;可以通过以下步骤来定位崩溃的位置&#xff1a; 一、查看调用栈&#xff08;Call Stack&#xff09; 打开调用栈窗口&#xff1a; 在Keil的调试模式下&#xff0c;点击菜单栏的“View” -> “Call Stack Window”&…...

Python读取PDF:文本、图片与文档属性

在日常的数据采集、文档归档与信息挖掘过程中&#xff0c;PDF格式因其版式固定、内容稳定而被广泛使用。Python 开发者若希望实现 PDF 内容的自动化提取&#xff0c;选择一个易用且功能完善的库至关重要。本文将介绍如何用Python实现 PDF文本读取、图片提取 以及 文档属性读取 …...

基于SpringBoot+Vue2的租房售房二手房小程序

角色&#xff1a; 管理员、房东、租客/买家 技术&#xff1a; springbootvue2mysqlmybatispagehelper 核心功能&#xff1a; 租房售房小程序是一个专注于房屋租赁和销售的综合性平台&#xff0c;基于SpringBootVue2MySQLMyBatisPageHelper技术栈开发&#xff0c;为用户提供…...

数学:学好数学需要对数系进行系统的对比和分析

数系范围:自然数通常是从 0 或 1 开始,用于计数的数,然后整数包括正负和零,有理数是分数,实数包括无理数,复数引入虚数单位。 运算性质:比如是否满足加法、乘法的封闭性,是否有逆元,是否有序,完备性等。 结构对比:比如代数结构,比如自然数是半群,整数是环,有理…...

基于本地LLM与MCP架构构建AI智能体全指南

一、AI智能体开发的新范式 随着人工智能技术的快速演进&#xff0c;AI智能体&#xff08;AI Agents&#xff09;正成为连接技术创新与实际应用的核心载体。从智能家居的温控系统到复杂的金融风控决策&#xff0c;AI智能体通过感知环境并执行目标导向的行为&#xff0c;正在重塑…...

AT2659_GNSS低噪声放大器芯片

AT2659 射频放大器在SiGe工艺平台上实现23dB增益与0.71dB噪声系数的优异组合&#xff0c;专为BDS/GPS/GLONASS/GALILEO多模导航系统优化设计。其宽电压适应能力&#xff08;1.4-3.6V&#xff09;与低至4.4mA的功耗特性&#xff0c;配合1.5mm1mm0.55mm的6脚DFN封装&#xff08;R…...

跨平台游戏引擎 Axmol-2.6.1 发布

Axmol 2.6.1 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 &#x1f64f;感谢所有贡献者及财务赞助者&#xff1a;scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 错误修复 修复Android armv7架构崩溃问题&…...

MADlib —— 基于 SQL 的数据挖掘解决方案(4)—— 数据类型之矩阵

目录 一、矩阵定义 二、MADlib 中的矩阵表示 1. 稠密 2. 稀疏 三、MADlib 中的矩阵运算函数 1. 矩阵操作函数分类 &#xff08;1&#xff09;表示函数 &#xff08;2&#xff09;计算函数 &#xff08;3&#xff09;提取函数 &#xff08;4&#xff09;归约函数&…...

ServBay 1.13.0 更新,新增第三方反向代理/内网穿透

ServBay 作为一款简化本地开发环境搭建与管理的强大工具&#xff0c;致力于打造一个开箱即用、稳定可靠的本地开发平台&#xff0c;让用户专注于代码编写&#xff0c;提升开发效率。 ServBay 1.13.0 正式发布&#xff01;本次更新聚焦于提升本地开发项目的外部可访问性、增强国…...

C#对象扩展方法:提升对象操作的灵活性与效率

C#对象扩展方法&#xff1a;提升对象操作的灵活性与效率 在C#编程中&#xff0c;我们经常需要对对象进行各种操作&#xff0c;如获取对象属性信息、转换对象格式、复制对象等。通过扩展方法&#xff0c;我们可以为现有类型添加新的功能&#xff0c;而无需修改原始类型的代码。…...

Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】

Python爬取天猫商品数据详细教程 一、前期准备 1. 环境配置 Python环境&#xff1a;确保已安装Python 3.x版本&#xff0c;建议使用Anaconda或直接从Python官网下载安装。第三方库&#xff1a; requests&#xff1a;用于发送HTTP请求。BeautifulSoup&#xff1a;用于解析HTM…...