Retrofit,如果第一个成功,RxJava 发出请求

Retrofit, RxJava make a request if first one is successful

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

@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 是按给定的方式创建的

Observable<BaseResponse<String>> loginObs = apiService.Login(merchant);
Observable<BaseResponse<Merchant>> addShopObs = apiService.addShop(shop);
Observable<BaseResponse<String>> logoutObs = apiService.Logout();

基本响应有一个成功字段,我应该根据它来决定登录是否成功。我想我可以使用地图来验证第一次登录观察者是否成功,但如果登录失败我不知道该怎么办。我怎样才能取消整个链条?

您可以从 loginObs 开始,根据登录成功将 loginResponse 平面映射到另一个 observable,因此 return addShopObs 或 return 一个错误 observable

(这将以错误终止链)

然后就可以继续正常flatMap商户对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.*/
    });