Как связать Observables и создать одно общее место для обработки ошибок

Мне интересно, как написать мой код более элегантно... У меня есть два запроса, второй запрос должен ждать первого. Если первый терпит неудачу, все предложение должно быть неудачным, мне интересно, как поймать ошибку в одном общем месте?

    enum TestError: ErrorType {
        case Connection
    }

    private func runTest() {
        rx_firstReq()
            .subscribeNext() { _ in
                return self.rx_secondReq()
                    .subscribeNext() { _ in
                        print("whole req sequence finished with success!")
                }.addDisposableTo(self.myDisposeBag)
        }.addDisposableTo(myDisposeBag)
    }

    func rx_firstReq() -> Observable<Bool> {
        return Observable.create() { observable -> Disposable in
            observable.onError(TestError.Connection) // We are assuming that first req gets failed
            observable.onCompleted()

            return NopDisposable.instance
        }
    }

    func rx_secondReq() -> Observable<Bool> {
        return Observable.create() { observable -> Disposable in
            observable.onNext(true)
            observable.onCompleted()

            return NopDisposable.instance
        }
    }

Как видите, нет места для обработки ошибок... Я понятия не имею, как это смоделировать, в этот момент каждый следующий запрос в моей цепочке будет создавать следующий уровень отступа... на мой взгляд, это не очень хорошее использование RxSwift... ????

..небольшой намек или ссылка с примером кода с обработкой ошибки в обычном месте мне бы очень пригодилась.


person Robert    schedule 05.04.2016    source источник


Ответы (1)


Никогда не используйте один subscribe в другом subscribe ! :)
Для вашей проблемы flatMap является решением.

rx_firstReq()
   .flatMap { _ -> Observable<Bool> in
      rx_secondReq()
   }
   .subscribe(next, error ...)
   .disposed(by: bag)

вуаля :)

person Pham Hoan    schedule 06.04.2016