改造,如果第一个成功,RxJava会提出请求

时间:2017-06-24 17:47:41

标签: android rx-java retrofit2 rx-android

基本上我必须首先登录用户,如果它成功了我必须添加商店并注销。改造界面如下所示

@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来验证第一个登录观察者的成功,但我不知道如果登录失败该怎么办。我如何取消整个链?

1 个答案:

答案 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.*/
    });