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)")
    })
复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 在pycharm中如何使用anaconda环境进行编辑_pycharm中导入pygame

    在pycharm中如何使用anaconda环境进行编辑_pycharm中导入pygame目录一.简单使用二:如何打包工程中的使用到的其他文件(如,excel,cfg等)三.通过pyinstaller打包后的resources,如何找到呢一.简单使用1.在虚拟环境中,添加pyinstallerlib2.将pyinstallertool加入到pycharm的externtool中-D,–onedirCreateaone-fold…

  • ip地址库 与浏览器的关系

    ip地址库 与浏览器的关系

    2021年10月23日
  • STM32 看门狗详解

    STM32 看门狗详解目录1、IWDG1.1独立看门狗简介1.2独立看门狗的特点1.3独立看门狗功能描述1.4硬件看门狗1.5寄存器访问保护1.6调试模式2、WWDG2.1简介2.2窗口看门狗主要特点2.3窗口看门狗功能说明2.4如何设置看门狗超时2.5调试模式3、区别1、IWDG1.1独立看门狗简介IWDG(Independentwatchdog)独立看门狗,可以用来检测并解决由于软件错误导致的故障,当计数器到达给定的超时值时,会触发

  • VMware 搭建私有云

    VMware 搭建私有云我们的目的是在VMwareworkstation上安装Centos7系统,并配置用远程桌面访问虚拟机。在虚拟机上安装Centos7首先按照老师给出的博客(VirtualBox安装Centos7笔记)进行安装。博主使用的是virtualBox,但VMware的操作也是基本相同,并且不需要单独设置虚拟机远程访问模式。安装完后我遇到了问题ifconfig:…

  • phpstorm-激活码(破解版激活)[通俗易懂]

    phpstorm-激活码(破解版激活),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • CTF流量分析常见题型(二)-USB流量

    CTF流量分析常见题型(二)-USB流量0x00前言在学习Wireshark常见使用时,对常见CTF流量分析题型和铁人三项流量分析题的部分问题进行了简单总结。由于篇幅过长,于是另起一篇总结常见流量包分析。包括USB流量包分析和一些其他流量包分析。0x01USB流量包分析USB流量指的是USB设备接口的流量,攻击者能够通过监听usb接口流量获取键盘敲击键、鼠标移动与点击、存储设备的铭文传输通信、USB无线网卡网络传输内容等等。在CTF中,USB流量分析主要以键盘和鼠标流量为主。1、键盘流量USB协议数据部分在LeftoverCapt

发表回复

您的电子邮箱地址不会被公开。

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