我在存储库中有这样的代码:

return Completable.fromAction { 
    // Some code 
    loginService.login(id) 
        .subscribe( 
            { response -> 
                if(response.isNotSuccessful()) { 
                    throw Exception() 
                } 
                // Some code 
            }, 
            { e -> 
                throw e 
            } 
    ) 
} 

我在 ViewModel 中编写了这样的代码:

fun onLoginAction(id) { 
    repository.login(id) 
        .subscribe( 
            { 
                showSuccess() 
            }, 
            { 
                showFailure() 
            } 
    ) 
} 

基本上,ViewModel 调用存储库中的登录方法,该方法返回Completable

当响应不成功时,这会导致 UndeliverableException。我希望调用 Completable 订阅者的 onError() 方法。我该怎么做?

请您参考如下方法:

我没有足够的知识来肯定地说出这一点,但我仍然认为这对您有一些值(value),而且对于评论来说太大了。

这就是我认为正在发生的事情。当 onError 失败时,rx 不会通过相同的可观察流运行它。相反,它会将其传播到 RxPlugins 错误处理程序,并最终传播到系统中的默认异常处理程序。你可以找到这个here .

这就是说,当 loginService.login(id)onError 中抛出异常时,Completable 流不会有有机会捕获它并将其转发到外部订阅的 onError 。换句话说,可完成流独立于登录服务流。

通常,您希望创建一个流并让 View 模型订阅它。如果您有多个流,rx 有大量运算符来帮助您链接这些流。尝试使存储库从服务返回一个流。像这样的事情:

fun login(id) = loginService.login(id) 

现在在 View 模型上,您可以使用相同的方法检查调用是否成功 - response.isNotSuccessful()


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!