带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(4)

简介: 带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(4)

带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(3)https://developer.aliyun.com/article/1339637?groupCode=taobaotech

第三步,这样就可以将load方法简化为:

 

1func rxLoad() -> Observable<[OrderObject]> {
2let orderService = [OrderService("鹅鹅鹅"), OrderService("鸭鸭鸭")] 
// 通过map构造Observable,通过flatMap对listOrder和queryUserInfo进行复合let observables = orderService.map { orderService in
makeObservable(f: orderService.listOrders).flatMap { (orders) -> Observable<[OrderObject]> in let userLoadF = makeStreamFunc(orders: orders, userInfoService: getUserService(site: order-
Service.site))
return makeObservable(f: userLoadF)

 

 

9

 

}

10

 

}

11

 

 

12

 

// merge两个平台的Observable

13

 

return Observable.merge(observables)

14

}

 

 

 

 

可以看到,第一步是通用的,实际代码中只需要做第二步和第三步,这就对上面的接口进行了大量的简化,并且库以统一的方式处理掉了合并、级联、多数据返回的复杂逻辑,我们有相当的把握来保证正确性。当然,除了学习成本较高以外,也还是有缺点的,主要是使用方式仍然是异步形式,在部分环节仍然需要处理异步带来的复杂度:

// 使用方调用
rxLoad().subscribe { orderObjects in
// onNext闭包中处理数据
} onError: { error in
// onError闭包中处理错误
} onCompleted: {
// onCompleted闭包中处理完成
} onDisposed: {
}

Rx确实大大简化了异步编程,但是还不够,因为它的使用仍然是异步形式。

 

使用AsyncSequence简化响应式编程

迭代器与序列

 

迭代器是很多语言都有的一个概念,一个迭代器的核心是next()函数,每次调用都会返回下一个数据,这些数据构   成了一个序列(Sequence),迭代器也意味着序列可以被遍历。

 

异步序列

 

代器的next()方法支持异步,就产生了异步序列。Swift对此提供了一个AsyncSequence的协议,并对它 提供了语言级别的支持,使得开发者可以以同步的形式遍历一个异步序列:

1for try await data in asyncDataList {
2print("async get data : + \(data)") 3  }


实际上,Swift在Combine中支持了Publisher的同步遍历:

// Combine的同步调用
for try await data in publisher.values {
print("async get publiser value \(data)") 4 }

 

 

 

不过这个特性需要iOS15才能支持,如果说iOS13还可以展望的话,iOS15就是遥遥无期了。

 

CPS变换

 

如果能将流式接口转换为异步序列,那么就可以实现响应式代码的同步编写,这个转换过程可以通过CPS变换实现。

 

CPS变换全称Continuation-Pass-Style,这个概念来自Lisp语系,是一种显式传递控制流的编程风格,其传递  控制流的载体就是continuation。continuation可以理解为当前代码执行的后续,如果一个函数f有一个continua- tion参数,我们就可以把当前的continuation传递进去,当函数产生结果时,通过continuation回到函数f外,继续  执行,这种函数调用方式成为call/cc(call with current continuation)。

 

这种变换,称为CPS变换。

 

作为一个类比,我觉得可以将continuation理解为return的在两个方面的推广形式,首先,continuationfirst-class的,可以作为变量存储,可以作为函数的参数和返回值,其次,continuation可以多次使用,而return只能有一次。

 

带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)https://developer.aliyun.com/article/1339634?groupCode=taobaotech

相关文章
|
2月前
|
SQL 安全 网络安全
从漏洞到攻击链:一次看懂黑客的思维链路
从漏洞到攻击链:一次看懂黑客的思维链路
298 4
|
5月前
|
存储 安全 前端开发
CC&LG实践|基于 LangGraph 一步步实现 Claude-Code 核心设计
本文旨在深入剖析 Claude-Code 的核心设计思想与关键技术实现,逆向分析其功能模块,结合 LangGraph 框架的能力,系统性地演示如何从一个最基础的 ReAct Agent 出发,逐步构建一个功能完备的简版 Claude-Code。
3140 19
CC&LG实践|基于 LangGraph 一步步实现 Claude-Code 核心设计
|
4月前
|
数据采集 测试技术 数据处理
12 种 Pandas 测试技巧,让数据处理少踩坑
本文介绍12种实用的Pandas测试技巧,涵盖数据工厂、模式校验、属性测试、快照比对、边界用例、随机控制、NA处理、索引验证、双实现对照、性能监控、I/O往返和Join检查,帮助开发者提前发现隐藏bug,提升数据处理代码的可靠性与可维护性。
225 6
|
Oracle 关系型数据库 数据库
手把手教你Oracle DataGuard主备切换(switchover)
手把手教你Oracle DataGuard主备切换(switchover)
1986 4
|
弹性计算 开发框架 .NET
阿里云服务器购买教程及云服务器地域、实例、操作系统、带宽等参数选择指南
对于初次购买阿里云服务器的用户来说,想使用阿里云服务器搭建网站或者运行APP、小程序等项目,第一步就是要先购买阿里云服务器,下面小编以图文形式给大家介绍一下阿里云服务器的购买流程,以及购买过程中如何云服务器地域、实例、带宽等关键配置和选择这些参数的一些注意事项,以供参考。
|
机器学习/深度学习 边缘计算 5G
|
安全 网络安全 Windows
电脑插上U盘不显示怎么回事?怎么解决?
平时使用电脑的时候经常会使用U盘来传输数据或是备份文件,有时候会遇到一个令头疼的问题,比如,将U盘插入电脑的USB口后,设备却显示不出来。电脑上插入U盘后却不显示会影响我们的正常工作。接下来,我们一起分析一下故障的原因和常见的解决方法。
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
1578 4
springboot + minio + kkfile实现文件预览
|
机器学习/深度学习 缓存 PyTorch
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
这篇文章是关于如何下载、安装和配置Miniconda,以及如何使用Miniconda创建和管理Python环境的详细指南。
6547 0
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
|
前端开发 Java iOS开发
elasticsearch8.1源码编译笔记
elasticsearch8.1源码编译笔记
287 0