收集 RxJava 中少数 PublicSubject 的所有响应

问题描述 投票:0回答:1

我的问题是: 我的代码中有这个方法:

public PublishSubject<Result> getUrl(String requestId) {...}

我有 5 个 url 可以从这个方法中获取,但我需要验证每个 url。如果这 5 个网址正确,那么我可以转到下一个,让我们在应用程序中将其称为状态。

我试图这样做:

 mGetAllUrlsDisposable = Observable.zip(
               store.getUrl(request1),
               store.getUrl(request2),           
               store.getUrl(request3),
               store.getUrl(request4),
               store.getUrl(request5),
               List::of
        ).subscribe(
                result -> {
                    boolean allPass = result.stream()
                            .allMatch(el -> {
                                        if (el.mStatus == Success) {
                                           //Additional code...
                                           return true;
                                       } else {
                                            return false;
                                        }
                                    }
                            );
                    if (allPass) {
                        goToNext();
                    } else {
                        terminateApp();
                    }
                },
                error -> Log.e(sTAG, "Error."));

但这是错误的代码。我想在订阅者获得值时获得所有结果,然后如果所有结果都得到正确验证,那么我可以进入下一个状态。 我在这里缺少什么? zip() 是正确的使用方法吗?我想不是......但它必须在RxJava中完成。

有什么想法吗?

java android rx-java
1个回答
0
投票

我不确定这段代码中哪些内容对您不利。如果您使用

allMatch
那么您必须注意:如果不需要确定结果,它可能不会评估所有元素上的谓词。如果您的目的是始终处理所有元素,请改用过滤器:

List<Result> successfulResults = result.stream()
            .filter((el) -> {
                //... 
               return el.mStatus == Success
            })
            .collect(Collectors.toList());
    if (successfulResults.size() == 5) {
        goToNext();
    } else {
        terminateApp();
    }

zip 就可以了。您还必须注意,如果 PublishSubject 在订阅之前发出数据,它将向 zip 提供数据。

© www.soinside.com 2019 - 2024. All rights reserved.