美文网首页RxSwift干货RXswift
RxSwift文档翻译8 - Error Handling Op

RxSwift文档翻译8 - Error Handling Op

作者: 小白猿 | 来源:发表于2017-06-02 14:56 被阅读64次

    前言

    本节中主要介绍错误处理

    // 定义一个错误
    public enum TestError : Error {
             case test
        }
    

    Error Handling Operators

    • catchErrorJustReturn
      遇到错误时限抛出预设的next事件,然后结束即Complete,但是不会发出错误事件
    example("catchErrorJustReturn") {
        let disposeBag = DisposeBag()
        
        let sequenceThatFails = PublishSubject<String>()
        
        sequenceThatFails
            .catchErrorJustReturn("😊")
            .subscribe { print($0) }
            .disposed(by: disposeBag)
        
        sequenceThatFails.onNext("😬")
        sequenceThatFails.onNext("😨")
        sequenceThatFails.onNext("😡")
        sequenceThatFails.onNext("🔴")
        sequenceThatFails.onError(TestError.test)
    }
    
    // 控制台打印的结果:
    --- catchErrorJustReturn example ---
    next(😬)
    next(😨)
    next(😡)
    next(🔴)
    next(😊)
    completed
    
    • catchError
      遇到错误会进入走闭包的分支,然后切换到闭包中返回的预先设置的其他的观察序列
     example("catchError") {
                let disposeBag = DisposeBag()
                
                let sequenceThatFails = PublishSubject<String>()
                let recoverySequence = PublishSubject<String>()
                
                sequenceThatFails
                    .catchError {
                        print("Error:", $0)
                        return recoverySequence
                    }
                    .subscribe { print($0) }
                    .disposed(by: disposeBag)
                
                sequenceThatFails.onNext("😬")
                sequenceThatFails.onNext("😨")
                sequenceThatFails.onNext("😡")
                sequenceThatFails.onNext("🔴")
                sequenceThatFails.onError(TestError.test)
                
                recoverySequence.onNext("😊")
            }
    
    // 控制台打印的结果:
    --- catchError example ---
    next(😬)
    next(😨)
    next(😡)
    next(🔴)
    Error: test
    next(😊)
    
    • retry
      遇到错误以后,会尝试通过再次订阅序列,如果在遇到错误就再订阅,如此周而复始
      官方示例程序
    example("retry") {
        let disposeBag = DisposeBag()
        var count = 1
        
        let sequenceThatErrors = Observable<String>.create { observer in
            observer.onNext("🍎")
            observer.onNext("🍐")
            observer.onNext("🍊")
            
            if count == 1 {
                observer.onError(TestError.test)
                print("Error encountered")
                count += 1
            }
            
            observer.onNext("🐶")
            observer.onNext("🐱")
            observer.onNext("🐭")
            observer.onCompleted()
            
            return Disposables.create()
        }
        
        sequenceThatErrors
            .retry()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
    
    // 控制台打印的结果:
    --- retry example ---
    🍎
    🍐
    🍊
    Error encountered
    🍎
    🍐
    🍊
    🐶
    🐱
    🐭
    

    为了展示周而复始的过程,我修改了一下代码

    example("retry") {
        let disposeBag = DisposeBag()
        var count = 1
    
        let sequenceThatErrors = Observable<String>.create { observer in
            observer.onNext("🍎")
            observer.onNext("🍐")
            observer.onNext("🍊")
    
    /***** 在增加一次错误,看其如何处理 ***/
            if count == 2{
                observer.onError(TestError.test)
                print("Error encountered")
                count += 1
            }
    /*********************************/
            if count == 1 {
                observer.onError(TestError.test)
                print("Error encountered")
                count += 1
            }
    
            observer.onNext("🐶")
            observer.onNext("🐱")
            observer.onNext("🐭")
            observer.onCompleted()
    
            return Disposables.create()
        }
    
        sequenceThatErrors
            .retry()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
    
    // 控制台打印的结果:
    --- retry example ---
    🍎
    🍐
    🍊
    Error encountered
    🍎
    🍐
    🍊
    Error encountered*****
    🍎
    🍐
    🍊
    🐶
    🐱
    🐭
    
    • retry(_:)
      和retry的功能一直,参数是限定了重复订阅的次数
    example("retry maxAttemptCount") {
                let disposeBag = DisposeBag()
                var count = 1
                
                let sequenceThatErrors = Observable<String>.create { observer in
                    observer.onNext("🍎")
                    observer.onNext("🍐")
                    observer.onNext("🍊")
                    
                    if count < 5 {
                        observer.onError(TestError.test)
                        print("Error encountered")
                        count += 1
                    }
                    
                    observer.onNext("🐶")
                    observer.onNext("🐱")
                    observer.onNext("🐭")
                    observer.onCompleted()
                    
                    return Disposables.create()
                }
                
                sequenceThatErrors
                    .retry(3)
                    .subscribe(onNext: { print($0) })
                    .disposed(by: disposeBag)
            }
    
    // 控制台打印的结果:
    --- retry maxAttemptCount example ---
    🍎
    🍐
    🍊
    Error encountered
    🍎
    🍐
    🍊
    Error encountered
    🍎
    🍐
    🍊
    Error encountered
    ``
    
    [下一篇:RxSwift文档翻译9 - Debugging Operators ](http://www.jianshu.com/p/75aefe7dc484)

    相关文章

      网友评论

        本文标题:RxSwift文档翻译8 - Error Handling Op

        本文链接:https://www.haomeiwen.com/subject/arhufxtx.html