带你读《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

相关文章
太空资源的开发与利用:太空经济的新篇章
【9月更文挑战第25天】随着科技进步,人类正逐步开发太空资源,开启太空经济的新篇章。太空资源涵盖轨道、矿物与能源三类,如地球轨道支撑着卫星活动,而小行星带和月球则蕴藏丰富矿物质与水冰,特别是月球氦-3及水冰资源,对太空活动至关重要。然而,太空资源开发需克服技术挑战与高成本问题,涉及航天器设计到资源提取等多个环节。尽管如此,其潜在的经济价值巨大,预估地月空间经济活动年产值可达数万亿美元,并将促进太空采矿、制造等新兴工业的发展,为全球经济增长注入新动力,推动人类社会进入新的发展阶段。
|
网络协议 Unix Linux
🌹史上最全的后端必备Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!🌹
 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。目前Linux存在着许多不同的Linux发行版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。
1148 2
🌹史上最全的后端必备Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!🌹
|
存储 数据库
数据库设计三范式
三范式设计的最终目的都是为了减少我们的工作量,所以说,尽管三范式是一种很好的指导规范,但在实际应用中,我们也不需要太局限在三范式中,更多的是应该从项目中出发,设计出合理的表结构。
.NET指定图片地址下载并转换Base64字符串
.NET指定图片地址下载并转换Base64字符串
324 0
|
网络协议 Java 测试技术
回顾Jmeter压力测试(二)
setUp Thread Group:一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。
257 0
|
开发者
开源软件项目是什么意思?底层原理是什么?
开源软件项目是什么意思?底层原理是什么?
791 0
|
前端开发
无处不在的前端矩阵变换(下)
在前端开发中不论CSS3也好,SVG也好,还是Canvas,无论多复杂的图形,都是由一个个点组成的。一个元素渲染后就可以得到一张位图,然后对这个位图上每一点进行变换,就可以得到新的一张位图,从而产生了视觉上的平移translate、旋转rotate、缩放scale、拉伸skew 等效果。这一切都是变换矩阵的功劳。
|
安全 大数据 云计算
浅谈如何利用低代码技术填补业务流程中的“IT真空”(一)
随着科学技术的进步和信息化时代步伐的不断加快,大数据,云计算,低代码技术等“新职业”如雨后春笋般不断涌现。如何学好,用好低代码技术,并将这些新技术运用到实际的工作和生活中,是数字化新时代下,我们所要学习的重中之重。
Linux基础命令---lynx浏览器
lynx lynx是一个字符界面的全功能www浏览器,它没有图形界面,因此占用的资源较少。 此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法 lynx [options] [path or URL] 2、参数列表 -accep...
1564 0

热门文章

最新文章