我有一个“大”可完成组件,它会进行一些错误检查,然后执行两个处理步骤。
它看起来像这样:
// someProcessorClass
public Completable checkAndProcessFile(InputStream file, ...) {
return checkHeaders(file, ...).andThen(processFile(file, ...));
}
private Completable checkHeaders(InputStream file, ...) {
// checks the first line for the right headers
// ...
if(firstLineIsGood) {
return Completable.complete();
}
return Completable.error(new Error('bad headers');
}
private Completable processFile(file, ...) {
return writeFile(file).andThen(writeMetadata(...));
}
我想要做的是让Completable
在第一个Completable checkHeaders()
处断开,但是似乎发生的是writeFile()
发生,而不管是否有错误。 writeMetadata()
不会被呼叫。
因此,似乎processFile()
急于要求对Completable
进行评估。我曾尝试将后半部分包装在Completable.fromCallable()
中,但随后需要像这样的内部订阅,这似乎……不是正确的方法。
private Completable processFile(file, ...) {
return Completable.fromCallable(()-> {
return writeFile(file).andThen(writeMetadata(...)).subscribe();
}
}
所以我的问题是,有没有办法以一种懒惰的方式链接Completables
?有点像flatMap
?
答案 0 :(得分:1)
您不提供您的writeFile
和writeMetadata
。但我认为他们可能会喜欢:
public Completable writeFile(InputStream file) {
try {
// write file here
} catch (IOException e) {
return Completable.error(e);
}
return Completable.complete();
}
那是完全错误的用法。您应该在Completable
中完成工作,而不仅仅是返回Completable
。正确的用法是
public Completable writeFile(InputStream file) {
return Completable.fromAction(() -> {
// write file here
});
}
答案 1 :(得分:0)
据我所知(这里是新手),
我以为我在做
checkHeaders.andThen(writeFile).andThen(writeMetadata)
但是通过将writeFile.andThen(writeMetadata)
包装在另一个Completable(processFile
)中,rxJava更像是
checkHeaders.andThen((writeFile.andThen(writeMetadata))
它首先开始评估内部括号。
因此,仅链接.andThen()
,就可以得到Completable
破坏onError
的预期结果。