问题描述
每次出现错误时,我都会进入处理袋,即使输入了正确的密码也无法输入
需要您的帮助
MockMessageHandler mockMessageHandler = mockMessageHandler();
mockMessageHandler.handleNext(message -> {
throw new HttpClientErrorException.create(...);
});
this.mockIntegrationContext.substituteMessageHandlerFor("httpGateway",mockMessageHandler);
解决方法
Observable约定是,Observable将发出零个或更多next
事件,然后发出停止事件,该事件可以是completed
或error
。一旦可观察对象发出错误,则监听该对象的所有订阅都将完成并将被处置。这是不能商量的。
为了保持订阅有效,最终来源必须不错误。最简单的方法是在flatMap中捕获错误并将其转换为其他错误。
以下是一个典型的登录订阅示例:
// in viewDidLoad or a function called from it:
loginButton.rx.tap
.withLatestFrom(Observable.combineLatest(emailTextField.rx.text.orEmpty,passwordTextField.rx.text.orEmpty))
.flatMapLatest { [viewModel] (email,password) in
viewModel!.performLogin(email: email,password: password)
.map { Result.success($0) }
.catchError { Observable.just(Result.failure($0)) }
}
.subscribe(onNext: { [weak self] result in
switch result {
case .success:
self?.loginSucceeded()
case .failure(let error):
self?.loginFailed(withError: error as? ApiError)
}
})
.disposed(by: disposeBag)
即使网络产生错误,只要视图控制器存在,上述订阅也将一直存在。
,self.loginViewModel.performLogin(email: email,password: password)
.observeOn(MainScheduler.instance)
.filter({ $0 != nil })
.subscribe{ _ in
self.loginSucceeded()
}.disposed(by: disposeBag)
self.loginViewModel.observeError()
.observeOn(MainScheduler.instance)
.subscribe{
self.loginFailed(withError: $0.element as? ApiError)
}.disposed(by: disposeBag)
感谢@ Daniel-这是我的灵魂之路