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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF「建议收藏」

    电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF「建议收藏」DNF卡顿怎么解决?相信很多玩家电脑的配置并不差,但是就是玩DNF会卡。今天就在这里教大家一些优化的方法。让你轻松摆脱DNF卡顿带来的困扰。如果是硬件问题的可以换硬件,如果是软件设置问题的可以优化自己的设置。首先要说的由于系统版本和软件版本的问题,每一项设置带来的提升也会不同,需要各位玩家自己摸索,我也会讲一下自己在不同系统测试的感受。我的电脑信息:下面是方法汇总:一、硬件:1.显卡虽然之前一直有…

    2022年9月11日
  • HDU 4337 King Arthur&#39;s Knights 它输出一个哈密顿电路

    HDU 4337 King Arthur&#39;s Knights 它输出一个哈密顿电路

    2022年1月16日
  • wsus无法同步计算机,Windows Update无法与WSUS同步,8024401c「建议收藏」

    wsus无法同步计算机,Windows Update无法与WSUS同步,8024401c「建议收藏」Hello,WSUS环境是windowsserver2016,客户端有server16和win101809,windows10可以正常与WSUS同步,其中一台windowsserver2016始终无法与wsus同步,查看该服务器的windowsupdatelog,得到以下信息===================================2019/09/1811:32:13.6…

    2022年6月14日
  • 怎么让Java输入字符串_怎么让Java获取用户输入的字符串[通俗易懂]

    怎么让Java输入字符串_怎么让Java获取用户输入的字符串[通俗易懂]从控制台动态输入数据,对数据进行各种各样的处理,然后将数据输出是很常见的操作。现在对数据的输入方式进行系统的介绍:Scanner类的调用相关方法:hasNext()判断扫描器中当前扫描位置后是否还存在下一段。hasNextLine()如果在此扫描器的输入中存在另一行,则返回true。next()查找并返回来自此扫描器的下一个完整标记。nextLine()此扫描器执行当前行,并返回跳过的输入信息。…

    2022年7月7日
  • MDK(keil)工具:如何使用MDK生成bin文件「建议收藏」

    MDK(keil)工具:如何使用MDK生成bin文件「建议收藏」在给开发板烧写程序时,有时候我们会用到bin文件,在使用MDK开发时,我们可以在魔法棒配置->output选项中看到生成hex文件的选项卡,图中标号1所示位置如果需要生成bin文件,就需要我们自己配置,配置方法如下,首先在魔术棒中找到User选项卡,并按照下图所示输入命令fromelf.exe–bin–output”@L.bin””#L”生成的文件名在图一中的红色标号2处设置。…

    2022年10月20日
  • 请简述list,set,map类型的集合的各自特点(简述三种不同的继承方式下)

    1.集合类型主要有3种:set(集)、list(列表)和map(映射)。2.三者关系3.Setset接口时Collection接口的一个子接口,是无序的,set中不包含重复的元素,也就是说set中不存在两个这样的元素a1.equals(a2)结果为true。又因为Set接口提供的数据结构是数学意义上的集合概念的抽象,因此他支持对象的添加和删除。Set的接口继承Collectio…

    2022年4月13日

发表回复

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

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