在RxJava中,何时使用map
和flatMap
?
例如,我们想将包含JSON的文件映射为包含该JSON的字符串——
使用map
时,必须处理Exception
。但是如何处理呢?:
Observable.from(jsonFile).map(new Func1<File, String>() {
@Override public String call(File file) {
try {
return new Gson().toJson(new FileReader(file), Object.class);
} catch (FileNotFoundException e) {
// So Exception. What to do ?
}
return null; // Not good :(
}
});
使用 flatMap
,虽然更加冗长,但我们可以将问题向下传递到链中的 Observables
并在其他地方处理错误,甚至可以重试:
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
@Override public Observable<String> call(final File file) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(Subscriber<? super String> subscriber) {
try {
String json = new Gson().toJson(new FileReader(file), Object.class);
subscriber.onNext(json);
subscriber.onCompleted();
} catch (FileNotFoundException e) {
subscriber.onError(e);
}
}
});
}
});
我喜欢map
的简洁性,但是flatmap
的错误处理更好(并不是因为它更啰嗦)。我还没有看到任何关于此的最佳实践,我很好奇实际上这是如何被使用的。
subscriber.onError()
等。我看到的所有示例都是通过这种方式路由错误。那不重要吗? - Christopher PerryOnErrorThrowable
的构造函数是private
的,您需要使用OnErrorThrowable.from(e)
代替。 - david.mihola