RxSwift 链接请求

RxSwift Chaining requests

我遇到的问题是链接 2 个请求和处理错误。 下面是我的代码示例:

func fbLogin() -> Observable<String> { ... }

func userLogin(request: Request) -> Observable<User> { ... }

let signedWithLogin = loginTaps
    .asDriver(onErrorJustReturn: ())
    .flatMapLatest { _ in
        return fbLogin()
        .map({ ReqestState<String>.loaded([=10=]) })
        .asDriver(onErrorRecover: { error  in
            return Driver.just(.error(error))
        })
        .startWith(.loading)
     }
     .map({ UserEndpoint.socialLogin(token: [=10=]) })
     .flatMapLatest { request in
         return userLogin(request: request)
         .map({ ReqestState<User>.loaded([=10=]) })
         .asDriver(onErrorRecover: { error  in
              return Driver.just(.error(error))
         })
         .startWith(.loading)
     }

signedWithLogin
    .drive(onNext: { response in
        print(response)
     })
    .disposed(by: disposeBag)

问题是当我取消 facebook 登录弹出窗口时我发送 observer.onError(FBLoginManagerError.canceled) 错误。此错误首先捕获 .asDriver(onErrorRecover: { error 方法,但不会传递给 .drive(onNext: { response 方法。

如何捕获 .asDriver(onErrorRecover: { error 方法中的所有错误?

Mukesh 是正确的,您可能应该避免 Driver 直到最后。此外,当您只真正关心最后一个 (RequestState<User>)

时,同时拥有两种 RequestState 类型毫无意义

这是一个更简单的版本,我认为它可以满足您的需求:

let signedWithLogin = loginTaps
    .flatMapLatest {
        fbLogin()
            .map { UserEndpoint.socialLogin(token: [=10=]) }
            .flatMap { userLogin(request: [=10=]) }
            .map { RequestState.loaded([=10=]) }
            .catchError { .just(.error([=10=])) }
            .startWith(.loading)
    }
    .asDriver(onErrorRecover: { fatalError([=10=].localizedDescription) }) // I'm using `fatalError()` here because if the above emits an error something has gone horribly wrong (like the RxSwift library isn't working anymore.)

signedWithLogin
    .drive(onNext: { response in
        print(response)
    })
    .disposed(by: disposeBag)

以上假定您将 UserEndpoint.socialLogin(token:) 函数更改为接受字符串而不是 RequestState<String>

它还假定 fbLogin()userLogin(request:) 各只发出一个值。您可能需要考虑将它们切换为 Singles.