山海万灵 HarmonyOS 文化知识实战续篇(17):loading、empty、error、retry 统一状态落地
知识应用启动时读者看到的并不是一个抽象的请求过程而是图鉴、地域和探索进度能否在合适的时刻出现。山海万灵把加载、内容、空态和恢复动作收敛为同一份状态让首页、图鉴、探索、馆长和档案页共享数据变化的语义。一、四种状态比多个布尔值更稳定单独维护 isLoading、isEmpty 和 hasError 容易产生互相矛盾的组合页面既在加载又提示没有内容或者已经回退到本地资料却仍显示错误。统一 phase 只允许一个主状态生效isLocalFallback 则补充内容的来源信息。export type ShanhaiAppDataPhase LOADING | CONTENT | EMPTY | ERROR; export interface ShanhaiAppLoadState { phase: ShanhaiAppDataPhase; message: string; isLocalFallback: boolean; } export function createShanhaiLoadingState(): ShanhaiAppLoadState { return { phase: LOADING, message: 正在同步山海资料请稍候。, isLocalFallback: false }; }这个模型的关键不在于枚举数量而在于页面只消费一个可信结果。内容可用时进入 CONTENT必要资料为空时进入 EMPTY远端与本地都无法提供内容时才进入 ERROR。每个状态都能映射到明确的视觉反馈和下一步动作。二、启动流程先写入 Loading再决定去向启动阶段先让页面进入 LOADING再由 Bootstrap 结果决定后续状态。内容加载和状态写入在同一处完成避免各个 Feature 页面分别猜测数据是否已经准备好。private async refreshBootstrap(): Promisevoid { this.appLoadState createShanhaiLoadingState(); try { const result await this.appViewModel.loadBootstrapWithStatus(); if (!result.hasRequiredContent) { this.appLoadState createShanhaiEmptyState(); return; } this.applyBootstrap(result.bootstrap); this.appLoadState createShanhaiContentState( result.isLocalFallback ? mock-api 暂不可用正在使用本地内容。 : 内容与图谱已同步。, result.isLocalFallback ); this.refreshAiContext(result.bootstrap.beasts[0].id); } catch (_) { this.appLoadState createShanhaiErrorState(); } }这段顺序同时保留了两层信息页面有没有可展示资料以及资料是否来自本地回退。远端请求暂时失败并不等于读者无法继续阅读只要本地资料完整页面仍进入 CONTENT并用提示语说明当前来源。三、空态和错误态承担不同责任状态出现条件页面反馈用户动作LOADING正在读取启动资料显示进度与同步提示等待CONTENT必要资料已经可用展示图鉴与探索内容继续浏览EMPTY启动结果缺少必要内容说明暂无可展示资料重新同步ERROR没有可用内容可以恢复给出恢复提示重试加载EMPTY 表示结果有效但没有可展示内容ERROR 表示无法获得可用内容。把两者合并会让恢复策略变得模糊空态需要重新同步错误态需要重试加载并且提示文字必须让读者知道接下来能够做什么。四、恢复面板只解释状态不复制业务流程统一面板根据 phase 选择标题和按钮文案。它不直接处理网络细节也不复制 Bootstrap 的读取逻辑所有恢复操作都回到 onRetry从而避免不同页面分别实现一套不一致的重试链路。private title(): string { if (this.state.phase LOADING) { return 正在准备山海资料; } if (this.state.phase EMPTY) { return 暂未发现可展示内容; } return 内容加载失败; } private actionText(): string { return this.state.phase EMPTY ? 重新同步 : 重试加载; }当页面进入恢复模式读者看到的是同一套术语和动作。后续如果增加网络状态、缓存更新或内容版本提示只需要扩展状态层的契约Feature 页面仍然通过同一面板获得一致反馈。五、重试入口必须回到同一条启动链路首页、图鉴、探索和馆长页将同一个 appLoadState 传入各自内容组件并把恢复动作回调到 refreshBootstrap。这样一次点击不会只刷新局部卡片而是重新取得完整 Bootstrap 并再计算跨页面共享的数据。ShanhaiHomePageContent({ beasts: this.beasts, discoveredCount: this.discoveredIds.length, passportCount: this.passportRegionIds.length, syncState: this.appLoadState, onRetrySync: () { this.refreshBootstrap(); } })这种入口收敛还能避免并发状态漂移。刷新前先切到 LOADING成功后一次性应用 Bootstrap失败时统一进入 ERROR页面不会在旧数据与新提示之间留下半更新的组合。六、页面证据观察的是恢复动作下图展示空资料状态下的“重新同步”入口。读者可以看到状态面板没有把空内容伪装成正常图鉴也保留了恢复动作。执行重试后应用会重新走 Bootstrap 流程并用内容状态或新的恢复状态替换当前面板。七、回退内容仍然属于 Content远端服务不可用而本地资料仍然完整时页面不会切换到 ERROR。内容、图谱和探索入口保持可用状态消息提示正在使用本地内容。这个取舍把“数据来源暂时变化”和“读者无法继续阅读”分开处理避免把可用的离线资料隐藏在错误页之后。结果主状态isLocalFallback页面行为远端成功CONTENTfalse显示同步完成后的内容远端失败、本地成功CONTENTtrue继续展示本地资料并提示来源必要资料为空EMPTYfalse显示重新同步没有可用资料ERRORtrue显示重试加载八、验收关注状态切换而不是单个控件验收这条链路时应先观察启动时的同步提示再检查内容可用后的一级页面随后进入空资料状态并点击重新同步确认恢复入口回到完整启动流程。验证重点是 phase、提示语和用户动作是否同步变化而不是只确认某个按钮能够被点击。function applyState(state: ShanhaiAppLoadState): string { if (state.phase LOADING) return 显示加载进度; if (state.phase CONTENT state.isLocalFallback) return 显示本地内容提示; if (state.phase CONTENT) return 显示已同步内容; if (state.phase EMPTY) return 显示重新同步入口; return 显示重试加载入口; }九、状态协议为后续功能保留边界统一状态并不要求每个页面拥有相同布局但要求它们对同一份数据结果作出一致解释。未来增加缓存刷新、内容版本或更细粒度的局部加载时可以在状态层增加字段或子状态而不让五个页面各自引入新的布尔值组合。状态模型、恢复入口和页面回读共同形成了一条可维护的加载链路。HarmonyOS 的状态管理机制可参考 ArkTS 状态管理官方概览。十、把状态更新视为一次完整提交加载链路还要处理快速重复触发。读者连续点击“重新同步”时旧请求可能晚于新请求返回如果旧结果直接覆盖页面就会把已经恢复的内容重新写回空态。状态协调层应为每次启动请求维护递增序号只接受仍然是最新序号的结果。这样 Loading、Content 和恢复面板始终对应同一次请求而不会因返回顺序随机变化。对本地回退也应采用同样的提交原则。先确认远端结果是否仍属于当前请求再决定是否采用本地内容本地内容一旦被选中就连同 isLocalFallback 和提示语一起写入状态。页面只在完整状态对象到达后重新渲染避免列表已经替换而顶部提示仍停留在旧请求的信息。private bootstrapSequence: number 0; private async refreshWithSequence(): Promisevoid { const sequence this.bootstrapSequence; this.appLoadState createShanhaiLoadingState(); try { const result await this.appViewModel.loadBootstrapWithStatus(); if (sequence ! this.bootstrapSequence) return; if (!result.hasRequiredContent) { this.appLoadState createShanhaiEmptyState(); return; } this.applyBootstrap(result.bootstrap); this.appLoadState createShanhaiContentState( result.isLocalFallback ? 正在使用本地内容。 : 内容与图谱已同步。, result.isLocalFallback ); } catch (_) { if (sequence this.bootstrapSequence) this.appLoadState createShanhaiErrorState(); } }这里的序号不是为了给请求编号展示给读者而是为了保护界面事实较早请求只能在它仍然最新时提交结果。网络慢、切换页面或重复点击都不会让旧回调覆盖当前状态。若页面已经卸载协调层也可以在生命周期结束时递增序号使未完成请求自然失效。状态消息同样需要在一次提交中更新。成功内容、空态说明和恢复按钮的文案不应分别异步写入它们属于一个对外可观察的状态快照。读者在任何时刻看到的标题、提示和动作都来自同一个 phase这也是排查加载问题时最容易复现、最容易回读的边界。当后续接入缓存刷新时可以把“正在显示旧内容并刷新”表示为 CONTENT 下的附加字段而不是重新引入多个互斥布尔值。页面继续展示当前图鉴提示区显示刷新进度只有缓存与网络内容都不可用时才转入恢复面板。这样既不会遮蔽可阅读内容也能让失败路径保持明确。

相关新闻

KKCE: 基于边缘计算脚本注入的网站测速逻辑劫持与合规审计-快快测

KKCE: 基于边缘计算脚本注入的网站测速逻辑劫持与合规审计-快快测

一、引言:为什么源代码干净,网站测速却显示"多余"的请求? 在前端安全领域,开发者习惯于通过本地构建检查(npm audit)和服务器端文件完整性校验来确保代码安全。只要本地 dist 目录下的 app.js 哈…

2026/8/7 0:57:44 阅读更多 →
李飞飞团队全新统一世界模型:15小时数据兼顾正向仿真、逆向动作生成

李飞飞团队全新统一世界模型:15小时数据兼顾正向仿真、逆向动作生成

一站式支撑机器人策略评估、模型规划与动作提取三大具身任务。 ——统一世界建模 目录 01 掩码视觉动作完整技术实现逻辑 掩码动作:把动作直接“画”进视频画面 两类互补掩码数据集构建方案 轻量化LoRA微调方案,无全量重训开销 三大下游标准化…

2026/8/7 0:57:44 阅读更多 →
企业级Git分支管理策略——从Git Flow到团队协作规范

企业级Git分支管理策略——从Git Flow到团队协作规范

一、为什么需要分支管理策略?在现代软件开发中,版本控制是团队协作的核心。Git提供了强大的分支管理能力,但如果没有明确的分支策略,团队很容易陷入:混乱的提交历史频繁的代码冲突不可预测的发布流程紧急Bug无法快速响…

2026/8/7 0:57:44 阅读更多 →

最新新闻

Spring Boot深度集成Apollo:动态刷新与灰度发布实战指南

Spring Boot深度集成Apollo:动态刷新与灰度发布实战指南

最近在技术社区交流时,经常看到一些关于“技术观点碰撞”的讨论。有开发者分享了自己的项目方案,很快就有其他博主提出不同见解,双方你来我往,好不热闹。这让我想到,在技术领域,观点的差异和讨论是常态&…

2026/8/7 1:53:10 阅读更多 →
Unity角色动画实战:从游戏热梗到程序化舞蹈动画实现

Unity角色动画实战:从游戏热梗到程序化舞蹈动画实现

1. 这篇文章真正要解决的问题看到这个标题,你可能会一头雾水:“猎空捣蒜舞”是什么?肚脐又怎么成了重点?这看起来更像是一个游戏或娱乐社区的梗,跟技术博客有什么关系?这正是本文要解决的核心问题&#xff…

2026/8/7 1:53:10 阅读更多 →
STM32入门实战:从GPIO控制LED到蜂鸣器驱动与代码架构优化

STM32入门实战:从GPIO控制LED到蜂鸣器驱动与代码架构优化

1. 从零到一:点亮你的第一颗STM32 LED拿到一块STM32开发板,看着密密麻麻的引脚和芯片,很多新手朋友的第一反应往往是“从哪开始?”。我的建议是,别管那么多复杂的通信协议和高级外设,就从最直观、最基础的G…

2026/8/7 1:53:10 阅读更多 →
图像处理连通性解析:四连通与八连通的本质区别与应用场景

图像处理连通性解析:四连通与八连通的本质区别与应用场景

1. 从一张图说起:为什么连通性会“骗人”? 如果你处理过图像,或者玩过扫雷、数独这类像素游戏,大概率遇到过“连通区域”这个概念。新手最容易踩的坑,就是默认所有相邻的像素都属于同一个区域,结果发现程序…

2026/8/7 1:53:10 阅读更多 →
PHP表格开发全攻略:从MVC架构到安全性能优化实践

PHP表格开发全攻略:从MVC架构到安全性能优化实践

1. 项目概述:从“PHP表格”说起,一个被低估的基石“PHP表格”这个标题,乍一看简单得甚至有些过时。在如今前端框架满天飞、各种数据可视化库层出不穷的时代,一个后端开发者再谈用PHP生成表格,是不是有点“复古”&#…

2026/8/7 1:53:10 阅读更多 →
Windows系统无损迁移实战:从原理到避坑的完整指南

Windows系统无损迁移实战:从原理到避坑的完整指南

1. 从“重装”到“迁移”:一次完整的Windows系统搬家实战如果你和我一样,是个重度依赖Windows环境进行开发、设计或日常办公的用户,那么“重装系统”这个词,大概率会带来一阵头皮发麻的恐惧。这不仅仅意味着要花上半天甚至一天的时…

2026/8/7 1:52:10 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →