मैं 2 नेटवर्क कॉल एक दूसरे के बाद निष्पादित करना चाहता हूं। दोनों नेटवर्क कॉल अवलोकन योग्य वापसी। दूसरा कॉल पहली कॉल के सफल परिणाम से डेटा का उपयोग करता है, दूसरे कॉल के सफल परिणाम में विधि से पहले पहले और दूसरे कॉल के सफल परिणाम का उपयोग करती है। इसके अलावा मुझे दोनों पर "घटनाओं" को अलग-अलग करने में सक्षम होना चाहिए। कैसे मैं नीचे दिए गए उदाहरण में इस तरह से परहेज कॉलबैक नरक को प्राप्त कर सकते हैं:चेन दो रेट्रोफिट वेरिएबल्स w/RxJava
API().auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<AuthResponse>() {
@Override
public void call(final AuthResponse authResponse) {
API().getUser(authResponse.getAccessToken())
.subscribe(new Action1<List<User>>() {
@Override
public void call(List<User> users) {
doSomething(authResponse, users);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorGetUser();
}
});
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorAuth();
}
});
मैं ज़िप के बारे में पता है, लेकिन मैं करने के लिए "Combiner वर्ग" बनाने से बचने चाहते हैं।
अद्यतन 1. akarnokd के जवाब को लागू करने की कोशिश की:
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(authResponse -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> {
getView().setError(processFail(throwable));
}), ((authResponse, users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
} else {
getView().setError(R.string.something_went_wrong);
}
}));
हालांकि flatMap
अंदर विधि संकलक यह authResponse और उपयोगकर्ताओं (authResponse.getAccessToken()
, users.get(0)
आदि) के तरीकों को हल नहीं कर सकता कहते हैं। मैं आरएक्स प्रोग्रामिंग और लैम्बडास के लिए नया हूं - कृपया मुझे बताएं कि समस्या क्या है। वैसे भी कोड अब बहुत साफ दिखता है।
अद्यतन 2.
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> getView().setError(processFail(throwable)))
.flatMap((AuthResponse authResponse) -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> getView().setError(processFail(throwable))), ((AuthResponse authResponse, List<User> users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
}
return Observable.just(this);
}));
इस तरह यह किया है, लेकिन अब मेरा नेटवर्क कॉल बिल्कुल क्रियान्वित नहीं कर रहे हैं।
मैं एक IDE से दूर हूँ, लेकिन मुझे लगता है कि त्रुटि लैम्ब्डा पैरामीटर नाम संघर्ष की वजह से है । – akarnokd
ऐसा लगता है कि आप अब सदस्यता नहीं ले रहे हैं। सुनिश्चित करें कि आप श्रृंखला के नीचे सदस्यता() सदस्यता लें। –