2016-04-05 6 views
0

もっとエレガントな方法でコードを書く方法が不思議です... 2つのリクエストがあり、2つ目のリクエストは最初のリクエストを待たなければなりません。最初のものが失敗した場合、文全体が失敗するはずです。私は、共通の場所でエラーを捕捉する方法を知りたいのですか?あなたがエラー処理のための任意の場所はありません見たよう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の良い使用法ではありません...

..いくつかのヒントやリンクの例のコードは、一般的な場所での処理のエラーと私には素晴らしいです。

答えて

5

subscribeをもう1つ使用しないでくださいsubscribe! :)
問題の場合は、flatMapが解決策です。

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

ほら:)