Last active
October 26, 2019 14:40
-
-
Save Soamid/e5567638cec63a4131ebac655c560977 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public Observable<Photo> searchForPhotos(String searchQuery) { | |
return Observable.fromCallable(() -> downloadUrlSource(searchQuery)) | |
.flatMap(googleSiteSource -> Observable.fromArray(extractPhotoUrls(googleSiteSource).toArray(new String[0]))) | |
.map(photoUrl -> { | |
try { | |
return getPhoto(photoUrl); | |
} catch (IOException e) { | |
log.log(Level.WARNING, "Could not download a photo", e); | |
} | |
return null; // ???!!! | |
}); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public Observable<Photo> searchForPhotos(String searchQuery) { | |
return Observable.fromCallable(() -> downloadUrlSource(searchQuery)) | |
.flatMap(googleSiteSource -> Observable.fromArray(extractPhotoUrls(googleSiteSource).toArray(new String[0]))) | |
.flatMap(photoUrl -> { | |
try { | |
return Observable.just(getPhoto(photoUrl)); | |
} catch (IOException e) { | |
log.log(Level.WARNING, "Could not download a photo", e); | |
} | |
return Observable.empty(); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Przykład pokazuje, w jaki sposób radzić sobie z pomijaniem niektórych elementów w przypadku wystąpieniu błędu. Zależy nam na tym by błąd nie przerywał w tym przypadku strumienia więc wywołanie
onError
nie jest możliwe.Pierwszy przykład (PhotoDownloaderBad) pokazuje intuicyjne, ale niestety nieprawidłowe podejście: w operatorze
map
opakowujemy problematyczne wywołanie w blocktry-catch
. Jeśli wszystko poszło dobrze, zwracamy wartość.... ale co zwrócić jeśli wystąpił błąd? Zwrócenienull
RX zasygnalizuje jako błąd. Można by zwracać jakąś atrapę obiektu i potem rozpoznawać ją w handlerze subskrypcji, ale to rozwiązanie też wydaje się niezgrabne i może prowadzić do błędów.Zamiast tego warto zauważyć, że w RX każdą wartość możemy "wsadzić do pudełka", które potem będzie obsługiwane przez strumień. Użyjemy do tego operatora
FlatMap
, który specjalizuje się w rozpakowywaniu takich pudełek. Po zastosowaniuFlatMap
(PhotoDownloaderGood) opakowujemy zwracany rezultat wObservable#just
, a w przypadku błędu zwracamyObservable#empty
, czyli "puste pudełko". W dół strumienia zostanie więc przepuszczona wartość lub nic, jeśli pudełko będzie puste.