RxSwift如何避免回调地狱

RxSwift如何避免回调地狱

大家好,又见面了,我是你们的朋友全栈君。

首先看如何制造回调地狱:

func fetchData(_ f: (String) -> Void) -> Void {
    f("1")
}

fetchData { (result) in
    print(result)
}
复制代码

那么可以总结出回调地狱的规则为:

(T -> ()) -> ()

如何避免回调地狱:单子的模型(简)

struct Monad<T> {
    var value: T
    func flatMap<U>(_ f: (T) -> Monad<U>) -> Monad<U> {
        return f(value)
    }
}

let monad = Monad(value: 10)
let result = monad
    .flatMap ({
        return Monad(value: String($0)) // "10"
    })
    .flatMap({
        return Monad(value: Float($0)! + 5) // 10.0 + 5
    })

result.value // 15
复制代码

所以单子模型的关键函数flatMap可以抽象成:

(T -> F(U)) -> F(U)

最后用RxSwift实现

func fetchData() -> Observable<String> {
    return Observable<String>.create { observer in
        DispatchQueue.global().async {
            sleep(1)
            DispatchQueue.main.async {
                observer.onNext("1")
            }
        }
        return Disposables.create()
    }
}
    
func convertToInt(source: String) -> Observable<Int> {
    return Observable<Int>.create { observer in
        let result = Int(source) ?? 0
        observer.onNext(result)
        return Disposables.create()
    }
}
    
func convertToBool(source: Int) -> Observable<Bool> {
    return Observable<Bool>.create { observer in
        let result = source > 0 ? true : false
        observer.onNext(result)
        return Disposables.create()
    }
}
复制代码

要实现单子就返回Observable即可。

产生回调地狱的调用方式(简化):

fetchData().subscribe(onNext: {
    self.convertToInt(source: $0).subscribe(onNext: {
        self.convertToBool(source: $0).subscribe(onNext: {
            print("final result: \($0)")
        })
    })
})
复制代码

不产生回调地狱(单子)的方式(简化):

self.fetchData()
    .flatMap({
        return self.convertToInt(source: $0)
    })
    .flatMap({
        return self.convertToBool(source: $0)
    })
    .subscribe(onNext: {
        print("final result:\($0)")
    })
复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107413.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 域代码 目录「建议收藏」

    域代码 目录「建议收藏」    SEQ图_3-/*ARABIC   ARABIC 表示阿拉伯数字     SEQ图_4-/*ARABIC/s1    /s  定义分隔字符。  在带有内置标题样式格式的段落中,每个连续标题级别的编号都重新从1开始。   这样每个图都从图4-1开始连续编号。 资料: AutoNu

    2022年6月12日
    31
  • S3C2440中断介绍

    S3C2440中断介绍1.1   S3C2440系统中断CPU和外设构成了计算机系统,CPU和外设之间通过总线进行连接,用于数据通信和控制,CPU管理监视计算机系统中所有硬件,通常以两种方式来对硬件进行管理监视:l  查询方式:CPU不停的去查询每一个硬件的当前状态,根据硬件的状态决定处理与否。好比是工厂里的检查员,不停的检查各个岗位工作状态,发现情况及时处理。这种方式实现起来简单,通常用在只有少量外设硬件的系

    2022年5月5日
    38
  • Centos7配置IP地址和DNS

    Centos7配置IP地址和DNS1.配置IP地址终端上输入ifconfig,找出网卡名称进入配置目录,找出对应网卡配置文件cd/etc/sysconfig/network-scripts/ls编辑配置文件vimifcfg-ens33修改成如下信息TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROU…

    2022年4月30日
    51
  • idea 2021.11.3激活码_最新在线免费激活

    (idea 2021.11.3激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~09…

    2022年3月28日
    229
  • 《FFmpeg从入门到精通》读书笔记(五)

    《FFmpeg从入门到精通》读书笔记(五)写在前面2019.06.24第六章FFmpeg滤镜使用(至6.5结束)FFmpeg滤镜使用FFmpeg滤镜Filter描述格式参数排列方式[输入流或标记名]滤镜参数[临时标记名];[输入流或标记名]滤镜参数[临时标记名]…例如:输入两个文件,一个视频文件input1.mp4,一个图片logo.jpg,将图像流缩放为2000×2000分辨率,放置在视频的左上…

    2022年6月26日
    26
  • journalctl基本介绍

    journalctl基本介绍journalctl基础用法1、查看所有日志(默认显示本次启动的所有日志)[root@localhost~]#journalctl查看本次启动的所有日志也可以使用[root@localhost~]#journalctl-b2、查看内核日志[root@localhost~]#journalctl-k3、查看指定时间的日志通过–since和–until选项,可以过滤任意时间限制,显示指定条件之前、之后或之间的日志[root@localhost~]#jour

    2022年5月10日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号