鸿蒙极速入门(六)-加载请求状态管理-LoadState+观察者模式
背景
1、在ArkTS的架构中,没有明确的可管理的加载请求状态的脚手架,在进行网络请求过程中,无法简单的进行交互响应。
2、参考Android中的LoadState写了一个简单的脚手架,以便在日常开发过程中,管理加载请求状态和UI交互。
脚手架说明与源码
1、状态机LoadState
使用一个状态机,分别对应网络请求过程中的Loading(发起请求)、Loaded(请求成功)、LoadError(请求失败)状态,并支持链式调用:
/**
* 网络请求MVVM数据模型,由子类实现状态机管理,由方法实现回调监听
*/
export abstract class LoadState {
/**
* loading函数,如果当前状态是Loading,则调用回调函数
* @param callBack 回调函数
* @returns this
*/
loading(callBack?: () => void): this {
if (this instanceof Loading) {
callBack?.call(null);
}
return this;
}
/**
* loaded函数,如果当前状态是Loaded,则调用回调函数
* @param callBack 回调函数
* @returns this
*/
loaded(callBack?: (result: Loaded<any>) => void): this {
if (this instanceof Loaded) {
callBack?.call(null, this);
}
return this;
}
/**
* loadError函数,如果当前状态是LoadError,则调用回调函数
* @param callBack 回调函数
* @returns this
*/
loadError(callBack?: (error: LoadError) => void): this {
if (this instanceof LoadError) {
callBack?.call(null, this);
}
return this;
}
}
/**
* Loading类,继承自LoadState类
*/
export class Loading extends LoadState {}
/**
* Loaded类,继承自LoadState类,包含一个result属性和一个data方法
*/
export class Loaded<T> extends LoadState {
result?: T;
constructor(data: T) {
super();
this.result = data;
}
data(): T | undefined {
return this.result;
}
}
/**
* LoadError类,继承自LoadState类,包含code和message属性
*/
export class LoadError extends LoadState {
code?: number;
message?: string;
constructor(code: number, message: string) {
super();
this.code = code;
this.message = message;
}
}
2、观察者模式
ArtTS没有提供开箱即用的观察者模式框架,也无法直接使用RxJS框架,所以自己手写一个简单的ValueNotifier作为观察者实现类:
/**
* ValueNotifier类,包含_value、listeners属性和addListener、notifyListeners、value方法
*/
export class ValueNotifier<T> {
private _value: T;
listeners: Array<() => void> = [];
constructor(value: T) {
this._value = value;
}
get value(): T {
return this._value;
}
set value(value: T) {
this._value = value;
this.notifyListeners();
}
addListener(listener: () => void) {
this.listeners.push(listener);
}
notifyListeners() {
for (let listener of this.listeners) {
listener();
}
}
}
使用示例
以获取一个车辆详情的场景来模拟网络请求和数据处理
1、ViewModel
import { Loaded, LoadError, Loading, LoadState, ValueNotifier } from './LoadState';
export class VehicleViewModel {
lsVehicleDetail: ValueNotifier<LoadState | null>;
constructor() {
this.lsVehicleDetail = new ValueNotifier<LoadState | null>(null);
}
// 获取车辆详情
async getVehicleDetail() {
// 发起请求
this.lsVehicleDetail.value = new Loading();
await new Promise(resolve => setTimeout(resolve, 3000));
// 获得数据
this.lsVehicleDetail.value = new Loaded("aa");
await new Promise(resolve => setTimeout(resolve, 3000));
// 模拟网络报错
this.lsVehicleDetail.value = new LoadError(123, "error");
}
}
2、页面处理
@Component
export struct VehicleComponent {
private vm: VehicleViewModel = new VehicleViewModel();
aboutToAppear() {
this.vm.lsVehicleDetail.addListener(() => {
this.vm.lsVehicleDetail.value?.loading(() => {
// 开始网络请求
console.log(`hello1:start Loading`);
}).loaded((result) => {
let data = result?.data() as String
console.log(`hello2:${result} - ${data}`);
}).loadError((error) => {
console.log(`hello3:${error?.code} - ${error?.message}`);
});
});
}
}
3、日志打印结果
hello1:start Loading
hello2:[object Object] - aa
hello3:123 - error
鸿蒙极速入门(六)-加载请求状态管理-LoadState+观察者模式的更多相关文章
- Unity动态加载和内存管理(三合一)
原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...
- [转]全面理解Unity加载和内存管理
[转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...
- 全面理解Unity加载和内存管理
全面理解Unity加载和内存管理http://game.ceeger.com/forum/read.php?tid=4394&fid=2&uid=6507 1.用简单的“for”循环 ...
- lmsw - 加载机器状态字
将源操作数加载到机器状态字,即寄存器 CR0 的位 0 到 15.源操作数可以是 16 位通用寄存器或内存位置.只有源操作数的低 4 位(也就是 PE.MP.EM 及 TS 标志)会加载到 CR0.C ...
- php+ajax实现拖动滚动条分批加载请求加载数据
HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- FusionCharts简单教程(六)------加载外部Logo
一.加载外部文件Logo 在使用FusionCharts时,我们可能需要在加载图像的时候需要在图表中显示标识.图片等等.这里我们可以使用logoURL属性来实现.如: <chart ...
- Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...
- Unity 全面理解加载和内存管理
最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...
- 理解Unity加载和内存管理
转自:http://game.ceeger.com/forum/read.php?tid=4394#info Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBun ...
- vue从入门到进阶:Vuex状态管理(十)
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 在 Vue 之后引入 vuex 会进行自动 ...
随机推荐
- JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装
一.使用JDBC批量添加 知识点复习: 1.JDBC的六大步骤 (导入jar包, 加载驱动类,获取连接对象, 获取sql执行器.执行sql与并返回结果, 关闭数据库连接) 2.封装了一个DBU ...
- 解决pandas 读取csv文件报错
使用encoding参数: pd.read_csv(path,sep=",",encoding='utf-16') 注意:该参数之后的编码格式,并不是固定的,需要用记事本打开csv ...
- 概率dp_C++详解
引入 概率 DP 用于解决概率问题与期望问题,建议先对概率和期望的内容有一定了解.一般情况下,解决概率问题需要顺序循环,而解决期望问题使用逆序循环,如果定义的状态转移方程存在后效性问题,还需要用到 高 ...
- 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
一.如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢? 文心一言: 在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现.期望运行时间考虑了所 ...
- Netty源码学习2——NioEventLoop的执行
系列文章目录和关于我 零丶引入 在<Netty源码学习1--NioEventLoopGroup的初始化>中,我们学习了NioEventLoopGroup和NioEventLoop的初始化, ...
- Pandas 使用教程 JSON
目录 JSON 转换为 CSV 简单 JSON 从 URL 中读取 JSON 数据: 字典转化为 DataFrame 数据 内嵌的 JSON 数据 复杂 JSON Pandas 可以很方便的处理 JS ...
- (2023.8.28)Hi铁布衫-CM Ver 0.001 - Cracked-writeup
Hi铁布衫-CM Ver 0.001 WriteUp 本文作者:XDbgPYG(小吧唧) 发布时间:2023年8月28日 内容概要:Hi铁布衫-CM Ver 0.001 WriteUp 收集信息 有一 ...
- 搭建Minio分布式服务
本文主要介绍Minio的分布式环境搭建,安装比较简单,因博主只有一台window,所以使用VM虚拟机搭建的. 搭建前可以先了解下minio: 1.官方文档:https://docs.min.io/cn ...
- Java程序员学vue3最好的方式就是搭建后台管理模板
前言 作为Java程序员,vue3还是有必要学的,毕竟是国内最受欢迎的前端JS框架,你现在接手的项目,前端部分几乎都会和vue沾边,尤其是中小企业. vue3作为新的大版本,相较于vue2改动还是很多 ...
- destoon上做纯js实现html指定页面导出word
因为最近做了范文网站需要,所以要下载为word文档,如果php进行处理,很吃后台服务器,所以想用前端进行实现.查询github发现,确实有这方面的插件. js导出word文档所需要的两个插件: 1 2 ...