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

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

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


响应式编程的同步形式

 

回头看最原始的代码,当我们调用orderService.listOrders时,传进去的callback,其实就相当于一个弱化版的continuation。这意味着,如果我们可以将使用continuation将数据表示为AsyncSequence,那么就可以将响应 式代码写成同步形式,从而大幅简化响应式编程。

 

Swift提供了continuation的概念,提供了AsyncStream和AsyncThrowingStream来实现这个过程,对上节Rx实现稍作改动即可。

 

第一步,实现一个将流式函数转换成AsyncThrowingStream的工具类,这个是通用的:

func makeSequence<Data>(f : StreamFunc<Data>) -> AsyncThrowingStream<Data, Error> {
AsyncThrowingStream<Data, Error>{ continuation in
f { data in
continuation.yield(data)
} _: { error in
continuation.finish(throwing: e)
} _: {
continuation.finish()
}
}
}

 

 

 

第二步,由于AsyncSequence还不支持merge,需要自己实现一个merge工具方法来实现多个流的组合,这个也是通用的:

//多个AsyncSequence merge成一个AsyncSequence
func mergeSequence<Seq : AsyncSequence>(seqs : [Seq]) -> AsyncThrowingStream<Seq.Element, Error> {
makeSequence(f: mergeF(fs: seqs.map(makeLoadFunc)))
}
func makeLoadFunc<Seq : AsyncSequence>(ats : Seq) -> StreamFunc<Seq.Element>{
{ onData, onError, onComplete in Task {
do {
for try await data in ats { onData(data)
}
onComplete()
} catch { onError(error)
}
}
}
}
func mergeF<Data>(fs : [StreamFunc<Data>]) -> StreamFunc<Data> {
{ onData, onError, onComplete in var finish = false
var results = fs.map{_ in false} for (index, f) in fs.enumerated() {
f { data in
if (!finish) { onData(data)
}
} _: { e in
// 如果是第一个错误,直接回调,同时标记为结束
if (!finish) { finish = true onError(e)
}
} _: {
// 注意,即使所有的请求都结束了,回调成功if (!finish) {
results[index] = true
// 所有都结束,回调
if (!results.contains(false)) { finish = true onComplete()
}
}
}
}
}
}

 

 

 


第三步,将listOrder和queryUserInfo转换成StreamFunc形式,与Rx中的第二步实现完全相同;

 

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

 

func asLoad() -> AsyncThrowingStream<[OrderObject], Error> {
let orderService = [OrderService("鹅鹅鹅"), OrderService("鸭鸭鸭")] 3
//  通过map构造AsyncSequence,通过flatMap对listOrder和queryUserInfo进行复合let streams = orderService.map { orderService in
makeSequence(f: orderService.listOrders).flatMap { (orders) -> AsyncThrowingStream<[OrderOb- ject], Error> in
makeSequence(f: makeLoadFunc(orders: orders, userInfoService: getUserService(site: order-
Service.site)))

 

8

 

}

9

 

}

10

 

 

11

 

// merge两个平台的AsyncSequence

12

 

return mergeSequence(seqs: streams)

13

}

 

 

可以发现,代码与RxSwift几乎是完全相同的,所以我们仍然有对于代码正确性的信心,不同的是,现在使用方也得以获得同样的信心:

 

 

 

for try await orderObject in asLoad() {
print("async get orderObject \(orderObject.first?.order.orderId)") 3  }

 

 

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

相关文章
|
缓存 监控 网络性能优化
从内核的视角观测容器——SysOM 容器监控
从内核的视角观测容器——SysOM 容器监控
太空资源的开发与利用:太空经济的新篇章
【9月更文挑战第25天】随着科技进步,人类正逐步开发太空资源,开启太空经济的新篇章。太空资源涵盖轨道、矿物与能源三类,如地球轨道支撑着卫星活动,而小行星带和月球则蕴藏丰富矿物质与水冰,特别是月球氦-3及水冰资源,对太空活动至关重要。然而,太空资源开发需克服技术挑战与高成本问题,涉及航天器设计到资源提取等多个环节。尽管如此,其潜在的经济价值巨大,预估地月空间经济活动年产值可达数万亿美元,并将促进太空采矿、制造等新兴工业的发展,为全球经济增长注入新动力,推动人类社会进入新的发展阶段。
|
网络协议 Unix Linux
🌹史上最全的后端必备Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!🌹
 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。目前Linux存在着许多不同的Linux发行版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。
1085 2
🌹史上最全的后端必备Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!🌹
|
设计模式 Java 调度
JUC线程池: ScheduledThreadPoolExecutor详解
`ScheduledThreadPoolExecutor`是Java标准库提供的一个强大的定时任务调度工具,它让并发编程中的任务调度变得简单而可靠。这个类的设计兼顾了灵活性与功能性,使其成为实现复杂定时任务逻辑的理想选择。不过,使用时仍需留意任务的执行时间以及系统的实际响应能力,以避免潜在的调度问题影响应用程序的行为。
217 1
|
自然语言处理 语音技术 开发者
ChatTTS超真实自然的语音合成模型
ChatTTS超真实自然的语音合成模型
486 3
|
关系型数据库 MySQL Shell
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day2 全网最快最全(下)
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day2 全网最快最全(下)
703 0
|
弹性计算 负载均衡 数据库
2024阿里云服务器试用规则及云产品试用常见问题解答
2024年阿里云服务器可以试用吗?不仅是云服务器产品,包括无影云电脑、云数据库 RDS、统型负载均衡 CLB、对象存储 OSS、文件存储 NAS等云产品都是可以试用的,只是需要注意的是,我们在试用云服务器产品之后,免费试用权益无法与新用户优惠购买活动同享,也就是说,领取了云服务器ECS免费试用权益的用户,将不能参产品新用户的相关活动。本文为大家介绍2024年阿里云服务器和其他云产品的试用规则及试用常见问题解答。
2024阿里云服务器试用规则及云产品试用常见问题解答
|
存储 关系型数据库 Java
技术经验解读:三种分布式事务LCN、Seata、MQ
技术经验解读:三种分布式事务LCN、Seata、MQ
636 0
|
存储 Linux 数据处理
Logstash 7.11安装配置
Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择,可以同时从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。
522 0
Logstash 7.11安装配置
|
传感器
基于ESP8266的环境监测系统
基于ESP8266的环境监测系统
421 0