Robert
Robert

Reputation: 3870

How to catch errors from two requests in one place using RxSwift

I'm quite new and I'm wondering how to catch error from requests which are zipped (see snipped above) in one place. In current implementation I have error handling in two places, but my goal is to have it in one place. My requests are zipped because if one of this req gets failed whole sequence will fail so in result I want to have one error handling place in code for both request.

 let firstReq =  self.sendReq() // returns  Observable<Bool>
        .catchError {
            error in
            return self.just(true)
    }

    let secondReq =  self.sendReqTwo() // returns  Observable<Bool>
        .catchError {
            error in
            return self.just(true)
    }


    goBttnOutlet.rx_tap
        .subscribeNext {
          Observable.zip(firstReqRes, secondReqRes) { (firstRes, secondRes) -> Bool in
                return firstRes && secondRes
            }.subscribeNext { summaryRes in
                print("🎿 \(summaryRes)")
            }.addDisposableTo(self.rx_disposableBag)
        }.addDisposableTo(rx_disposableBag)

..maybe some link with example code with handling error in common place will be great for me. Thanks a lot.

Upvotes: 0

Views: 1650

Answers (1)

tomahh
tomahh

Reputation: 13651

zip returns a new Observable<T>, so you can simply move the catchError operator application to what zip returns.

let firstReq =  self.sendReq()
let secondReq =  self.sendReqTwo()
let zippedReq = Observable.zip(firstReq, secondReq)
    .catchErrorJustReturn { _ in true }

goBttnOutlet.rx_tap
    .subscribeNext {
      zippedReq.subscribeNext { summaryRes in
            print("🎿 \(summaryRes)")
        }.addDisposableTo(self.rx_disposableBag)
    }.addDisposableTo(rx_disposableBag)

On a side note, you could improve the chain after goBttnOutlet to the following

goBttnOutlet.rx_tap.flatMap { zippedReq }
    .subscribeNext { summaryRes in
        print("🎿 \(summaryRes)")
    }.addDisposableTo(rx_disposableBag)

See flatMap documentation for details.

Upvotes: 1

Related Questions