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)
上一篇 2022年4月3日 下午3:35
下一篇 2022年4月3日 下午3:35


相关推荐

  • Java SkipList 实现

    Java SkipList 实现packagedatas importjava util Random publicclassS publicSkipLi tail publicintn size publicinth high publicRandom publicSkipLi SkipListE

    2026年3月26日
    2
  • c 语言条件运算符,C 语言条件运算符详细讲解

    c 语言条件运算符,C 语言条件运算符详细讲解C语言条件运算符详细讲解如果希望获得两个数中最大的一个,可以使用if语句,例如:if(a>b){max=a;}else{max=b;}不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为:表达式1?表达式2:表达式3条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2的值作为整个条件表达式的值,否则以表达式3的值作为整…

    2022年10月2日
    3
  • C语言fread函数_C语言fread

    C语言fread函数_C语言freadc语言中fread函数C语言中的fread()函数(fread()functioninC)Prototype:原型:size_tfread(void*buffer,size_tlength,size_tcount,FILE*filename);Parameters:参数:void*buffer,size_tlength,si…

    2025年11月4日
    12
  • JS获取当前年份_js获取当前时间年月日

    JS获取当前年份_js获取当前时间年月日小知识积累(2)lettimestamp=Date.parse(newDate());letdate=newDate(timestamp);//获取年份letthieYear=date.getFullYear();

    2026年2月22日
    6
  • Java解析XML并自动写入Excel

    Java解析XML并自动写入Excel实习期间导师给我分配了个小任务把xml文件中的字段内容腾到excel中,中间涉及一些对于数据的分析抽取等,但都有规可循,有道是懒是编程发展的原动力,所以我自己做了一个小demo实现了以上功能的自动化目录实现效果Java解析XML文件源数据到填入Excel数据的转换自动写入Excel实现效果xml文件大致是这样的手动录入大致是这样的程序实现控制台输出写入文件我把整个功能剖成三部分Java解析XML文件源数据到填入Excel数据的转换自动写入ExcelJava解析XM.

    2022年8月22日
    12
  • eclipse项目导入教程

    eclipse项目导入教程文章目录 1 打开项目 2 配置项目 1 打开项目下图是本次的测试项目 这个项目名为 测试 点击 File gt OpenProjects 选择文件夹 eclipse 会自动识别 点击 finish 初步完成 2 配置项目

    2026年3月19日
    2

发表回复

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

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