[英]Rxjava - chain observables
請看這段代碼:
Disposable disposable = mcityService.authLogin(request,Utils.prepareHeaders())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(resp ->
{
mCompositeDisposable.add(mcityService.getUserDetails(selectedCity.id,Utils.prepareHeaders(resp.tokenType,resp.accessToken))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userDetails ->
{
/*process resp and user details*/
}));
}, throwable ->
{
process errors
});
mCompositeDisposable.add(disposable);
}
所以基本上我需要調用authLogin
,如果成功,則調用getUserDetails
(需要來自authLogin
調用結果的某些字段),如果getUserDetails
成功,則鏈完成,我需要兩個調用的一些額外處理結果。 如果authLogin
失敗或getUserDetails
失敗,則應執行錯誤處理(例如,從throwable獲取http錯誤代碼或消息)。
由於我的方法有效,我知道這不是goot方法,如何優化它? 我可以使用flatMap
運算符代替嵌套的observable嗎?
編輯:方法聲明:
public static Map<String, String> prepareHeaders(String tokenType, String accessToken);
Observable<UserDetails> getUserDetails(@Path(value = "cityId", encoded = true) String cityId, @HeaderMap Map<String, String> headers);
最后的嘗試:
mcityService.authLogin(request, Utils.prepareHeaders())
.concatMap(response ->
{
final Map<String, String> headers = Utils.prepareHeaders(response.tokenType,response.accessToken);
return mcityService.getUserDetails(selectedCity.id, headers)
.map(userDetails -> new Object()
{
public AuthResponse ar = response;
public UserDetails ud = userDetails;
});
})
.doOnNext(responseDetails ->
{
AuthResponse ar = responseDetails.ar;
UserDetails ud = responseDetails.ud;
})
.doOnError(throwable ->
{
final String message = throwable.getMessage();
});
結果: .doOnNext
從未調用過, mcityService.getUserDetails
似乎永遠不會調用, .doOnError
也從未調用過(因此沒有錯誤)。 首先mcityService.authLogin
調用返回Observable<AuthResponse>
我真的不需要subscribe
嗎?
是的,你可以,並且應該使用flatMap
/ concatMap
/ switchMap
。
對不起,如果編碼不好,我主要使用RxJS,它有pipable運算符(好多了!)。
mcityService.authLogin(request, Utils.prepareHeaders())
.concatMap(response -> {
final Map<String, String> headers = Utils.prepareHeaders(resp.tokenType,resp.accessToken);
return mcityService.getUserDetails(selectedCity.id, headers)
.map(userDetails -> ResponseUserDetails.of(response, userDetails));
})
.doOnNext(responseDetails -> {
// Hanlde ResponseUserDetails object
})
.doOnError(throwable -> {
// Handle exception
final String message = throwable.getMessage();
...
})
.subscribe(
responseDetails -> { ... },
throwable -> { ... }
);
如果您不想使用其他類,則可以動態創建Object
return mcityService.getUserDetails(selectedCity.id, headers)
.map(userDetails -> new Object() {
public Response r = response;
public UserDetails ud = userDetails;
});
並通過訪問其字段
.doOnNext(responseDetails -> {
final Response r = responseDetails.r;
final UserDetails ud = responseDetails.ud;
...
})
static class ResponseUserDetails {
final Response response;
final UserDetails userDetails;
ResponseUserDetails(
final Response response,
final UserDetails userDetails) {
this.response = response;
this.userDetails = userDetails;
}
static ResponseUserDetails of(
final Response response,
final UserDetails userDetails) {
return new ResponseUserDetails(response, userDetails);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.