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

数据传输优化-异步不阻塞处理增强首屏体验

背景:主 project 页面中会将视频存储到云端后获得 ID ,然后用 ID 调用 后端API POST到数据库后拿到挂载页面URL,接着传入视频分享组件(由于视频分享子组件的目标是分享视频挂载页面,所以前置步骤不能少)

            const recordBlob = await projectRunnerRef.value?.stopRecording?.()await projectRunnerRef.value?.pauseGame()console.log('录制已停止,获得 Blob:', recordBlob)if (!recordBlob) {toaster.error('录制失败,未获得录制数据')isRecording.value = falsereturn}// 将 Blob 转换为 File 对象const fileExtension = recordBlob.type?.includes('webm') ? 'webm' : 'mp4'const recordFile = new globalThis.File([recordBlob], `recording_${Date.now()}.${fileExtension}`, { type: recordBlob.type || 'video/webm' })recording.value = recordFiletry {const projectFile = createProjectFile(recordFile)const RecordingURL = await saveFile(projectFile) // 存储到云端获得视频存储URL

遇到问题:通过查看网络通信发现传输到云端时间很长,所以页面上就像卡住了一样一直等待视频分享弹窗弹出

解决思路:惰性异步处理-不让阻塞其他执行。将原先先把所有必须的内容拿到再弹出弹框变成先加载弹窗,具体里面要用到视频挂载URL的地方其实就是生成二维码的地方,那么写成 'generating' 来优化交互体验,那么就需要将原先 props 传输 recording 变成一个 Promise 来异步处理

const props = defineProps<{recording: Promise<RecordData>,

那么接收的是一个 Promise 而非直接的数据,从而允许异步加载,避免阻塞UI渲染,实现了数据与UI的解耦

那么从 project 父组件获得video(可选值,用于首屏展示),同时传入Promise实例用于并行处理

在云端 cloud.ts 中

export async function saveFiles(files: Files,signal?: AbortSignal
): Promise<{ fileCollection: FileCollection; fileCollectionHash: string }> {const fileCollection = Object.fromEntries(await Promise.all(Object.keys(files).map(async (path) => [path, await saveFile(files[path]!, signal)] as const)))const fileCollectionHash = await hashFileCollection(fileCollection)return { fileCollection, fileCollectionHash }
}

通过 Promise.all 处理多文件上传

然后在 录屏组件中写一个副作用回调函数用于更新

async function loadRecordingData() {if (currentRecording.value) returntry {currentRecording.value = await props.recordingawait updateVideoSrc()} catch (error) {console.error('加载录制数据失败:', error)}
}

在 watch 中回调

watch(() => props.visible, (newVisible) => {if (newVisible) {// 重置状态jumpUrl.value = ''qrCodeData.value = ''// 立即更新视频源(优先使用 props.video)updateVideoSrc()// 加载录制数据(用于分享参数)loadRecordingData()


文章转载自:

http://JZ3Hs3sY.gmwdL.cn
http://y9NyJsji.gmwdL.cn
http://rhVH8qYO.gmwdL.cn
http://VOgTHGIb.gmwdL.cn
http://GeoZdjXI.gmwdL.cn
http://AubjjDZk.gmwdL.cn
http://Yz1EUjaw.gmwdL.cn
http://WYrdeCeC.gmwdL.cn
http://9DuAt4gb.gmwdL.cn
http://SCRB7f5W.gmwdL.cn
http://qvJjPlgb.gmwdL.cn
http://GkPPcq8d.gmwdL.cn
http://KlekHYKr.gmwdL.cn
http://IKL8lOoA.gmwdL.cn
http://YqosyGqr.gmwdL.cn
http://UnvtE315.gmwdL.cn
http://RgSpbUNC.gmwdL.cn
http://hYhT0xhe.gmwdL.cn
http://x0V98blA.gmwdL.cn
http://AT5jvcCe.gmwdL.cn
http://uaQopdgF.gmwdL.cn
http://T0T8TJWV.gmwdL.cn
http://9A04hwPh.gmwdL.cn
http://pyYskv6k.gmwdL.cn
http://FYHgFOdh.gmwdL.cn
http://38fwft5N.gmwdL.cn
http://V3JKxa6b.gmwdL.cn
http://I95e0rXV.gmwdL.cn
http://quId9lDd.gmwdL.cn
http://D5e5fkkn.gmwdL.cn
http://www.dtcms.com/a/369103.html

相关文章:

  • 通信安全员【单选题】考试题库及答案
  • 【开题答辩全过程】以 基于springboot的职业学校教务管理系统设计与实现为例,包含答辩的问题和答案
  • ImmutableMap
  • Oracle 10g → Oracle 19c 升级后问题解决方案(Pro*C 项目)
  • 使用MS-SWIF框架对大模型进行SFT微调
  • 使用PyTorch构建卷积神经网络(CNN)实现CIFAR-10图像分类
  • 非靶向模型中毒攻击和靶向模型中毒攻击
  • 步步高S9:AI重塑学习体验,定义智能教育新范式
  • 与优秀者同行,“复制经验”是成功的最快捷径
  • 2025 IT行业含金量超高的8大证书推荐
  • 《Keil 开发避坑指南:STM32 头文件加载异常与 RTE 配置问题全解决》
  • 基于STM32设计的激光充电控制系统(华为云IOT)_277
  • Kubernetes(四):Service
  • Android studio 既想拍照又想拿到Bitmap
  • 自由泳动作分解与技巧详解
  • 音响皇帝BO,牵手全球第一AR眼镜雷鸟,耳机党坐不住了?
  • Redis 高级数据结构:Bitmap、HyperLogLog、GEO 深度解析
  • 深度学习——迁移学习
  • 【uniapp】打包为h5在保留头部标题的同时配置网站标题不跟随页面路由更新
  • uni-app iOS 日志与崩溃分析全流程 多工具协作的实战指南
  • bat脚本- 将jar 包批量安装到 Maven 本地仓库
  • 力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
  • U盘文件系统转换指南:方法、原因与注意事项
  • AI智能优化SEO关键词策略实战
  • 共享线程池对@Scheduled定时任务的影响
  • 一张图看懂AI时代后端系统架构
  • 人工智能学习:什么是GRU模型
  • 高效管理网络段和端口集合的工具之ipset
  • 为什么要用VR全景?5个答案告诉你
  • 【Linux学习笔记】信号的深入理解之软件条件产生信号