我有一个简单的用例:在Remote源中查找Book,如果它不存在,则创建它。 所以这是我用来处理rxJava1的方法:
public void handleBook(int id) {
getBookById(id)
.flatMap(new Func1<Book, Observable<Book>> {
@Override
public Observable<Book> call(Book book) {
if(book != null) // it exists
...
else // it's null - it doesn't exist ...
}
}
}
public Observable<Book> getBookById(int id) {
Book book = remoteSource.book(id)
return Observable.just(book)
}
在这种情况下,如果对象book
为null,则Observable.just调用将引发异常。它显式检查空值。
回到rxJava 1我可以将null作为值传递给Observable.just(或其他的加速器),然后在map或flatMap运算符中我检查我得到的值是否为null(意味着结果不存在)或不是(意思是我得到了一些结果)。
有了这个限制,似乎我再也不能做这个检查了。我尝试返回Observable.empty(),以防book
对象为null但整个线程将完成并在返回值为Observable.empty()时完成。
如果我需要的东西在那里并且之后分支执行链,我如何签入rx执行链?
答案 0 :(得分:1)
不使用Observable<Book>
作为返回类型,而是使用Single<Book>
。 Single
类型会发出对象或错误
注意:现在我没有IDE,因此代码可能会有一些编译器失败。我假设你会很容易解决它
public Single<Book> getBookById(int id) {
return Single.create((e) => {
Book book = remoteSource.book(id)
if (book != null)
e.emit(book);
else
e.fail();
}
}
public void handleBook(int id) {
getBookById(id)
.onErrorResume(e => createBook(...))
...
}
就像之前所说的那样,我不确定确切的代码,但你可以把它读作好像是伪代码