RxJava2 将两个 Single 转换为 Completable

Jak*_*old 2 java android rx-java2

我有两个单曲,我想做的是将它们转换为 Completable

 final Single<Boolean> httpRequestOne = createHttpRequestOne();
 final Single<Boolean> httpRequestTwo = createHttpRequestTwo();
Run Code Online (Sandbox Code Playgroud)

如果两个单曲都返回 true,则 Completable 的结果应该是 onSuccess 否则它将是 onError。

我也希望它们并行运行,所以我认为 concat 在这里无济于事

final Flowable<Boolean> flowable = httpRequestOne.concatWith(httpRequestTwo);
Run Code Online (Sandbox Code Playgroud)

GVi*_*i82 5

我会使用zip运算符,以便您可以:

  • 合并两个操作的结果
  • 并行化工作(订阅不同的调度程序)

最终您可以将两个结果转换为您想要的单个结果(在您的情况下,它只是一个逻辑 AND)。

private Completable createCompletable() {
        return Single.zip(createHttpRequestOne().subscribeOn(Schedulers.newThread()),
                createHttpRequestTwo().subscribeOn(Schedulers.newThread()), (b1, b2) -> b1 && b2)
                .flatMap(new Function<Boolean, SingleSource<Boolean>>() {
                    @Override
                    public SingleSource<Boolean> apply(@NonNull Boolean aBoolean) throws Exception {
                        if (aBoolean) {
                            return Single.just(true);
                        } else {
                            return Single.error(new Throwable("one of the Single returned FALSE"));
                        }
                    }
                }).toCompletable();
    }
Run Code Online (Sandbox Code Playgroud)

然后订阅它:

createCompletable()
     .subscribe(() -> logd("onCompelte"),
                throwable -> logd("error: " + throwable.getMessage()));
Run Code Online (Sandbox Code Playgroud)

如果两者都Single完全发出 TRUE,onComplete将从您的可完成项中发出,否则您将收到错误,并将onError在您的订阅中触发。