RxJava2 |使用.andThen()链接嵌套的Completables

时间:2018-08-06 21:05:14

标签: rx-java2

我有一个“大”可完成组件,它会进行一些错误检查,然后执行两个处理步骤。

它看起来像这样:

// 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

2 个答案:

答案 0 :(得分:1)

您不提供您的writeFilewriteMetadata。但我认为他们可能会喜欢:

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的预期结果。

相关问题