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:)
各只发出一个值。您可能需要考虑将它们切换为 Single
s.
我遇到的问题是链接 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:)
各只发出一个值。您可能需要考虑将它们切换为 Single
s.