基本上我必须首先登录用户,如果它成功了我必须添加商店并注销。改造界面如下所示
@POST("merchant/register")
Observable<BaseResponse<String>> Login(@Body Merchant merchant);
@PUT("merchant/{username}")
Observable<BaseResponse<Merchant>> Logout();
@POST("shop")
Observable<BaseResponse<Shop>> addShop(@Body Shop shop);
观察者是按照给定的
创建的Observable<BaseResponse<String>> loginObs = apiService.Login(merchant);
Observable<BaseResponse<Merchant>> addShopObs = apiService.addShop(shop);
Observable<BaseResponse<String>> logoutObs = apiService.Logout();
Base响应有一个成功字段,我应根据该字段来确定登录是否成功。我想我可以使用map来验证第一个登录观察者的成功,但我不知道如果登录失败该怎么办。我如何取消整个链?
答案 0 :(得分:3)
你可以从loginObs开始,将loginResponse的flatMap映射到另一个observable,具体取决于登录的成功,所以要么返回addShopObs,要么返回一个可观察的错误
(将以错误终止链)
然后你可以继续正常地将merchantResponse平面映射到logoutObs。
以下是如何实现的:
loginObs(merchant)
.flatMap(loginResponse -> {
if (/*successful check*/)
return addShopObs;
else
return Observable.error(new Exception("Login failed!"));
// or throw your own exception, this will terminate the chain and call onError on the subscriber.
})
.flatMap(merchantResponse -> logoutObs)
.subscribe(logoutResponse -> {
/*all operations were successfull*/
}, throwable -> {
/*an error occurred and the chain is terminated.*/
});