Rxjava2,zipped iterable和interval,只执行一个映射的observable

时间:2017-05-22 07:51:24

标签: rx-java2

我有以下需要实现的方案:

  • 执行每个网络调用以获取请求对象列表,每个延迟时间为1秒

我使用rxjava2

进行了以下实现
  • 发出间隔
  • 发出可迭代
  • 压缩它们从可迭代来源中发出每个项目

到目前为止没有问题,我完全理解它是如何工作的,现在我将上面的内容整合到下面的

  • 映射 zip 发出的每个项目到一个新的observable,用于推迟/推迟网络调用的可观察来源
  • 每个映射发布的可观察对每个请求
  • 执行个人网络调用

我最终得到以下代码

 Observable
            .zip(Observable.interval(1, TimeUnit.SECONDS), Observable.fromIterable(iterableRequests), new BiFunction<Long, RequestInput, RequestResult>() {

                @Override
                public RequestResult apply(@NonNull Long aLong, @NonNull final RequestInput request) throws Exception {
                    return request;
                }
            })
            .map(new Function<RequestResult, ObservableSource<?>>() {

                @Override
                public ObservableSource<?> apply(@NonNull RequestResult requestResult) throws Exception {

                    // map each requestResult into this observable and perform a new stream
                    return Observable
                            .defer(new Callable<ObservableSource<?>>() {
                                // return a postponed observable for each subscriber
                            })
                            .retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
                                // return throwable observable
                            })
                }
            })
            .subscribe(new Observer<ObservableSource<?>>() {

                //.. onSubscribe {}
                //.. onError {}
                //.. onComplete {}

                @Override
                public void onNext(ObservableSource<?> observableSource) {
                    // actual subscription for each of the Observable.defer inside
                    // so it will start to emit and perform the necessary operation

                }
            });

但问题是,它执行Observable.defer源,只有 ONCE ,但继续迭代(通过在地图运算符中放置一个Log来查看迭代)。

任何人都可以指导我,我怎样才能实现我想要的东西,我耗尽了大量的论文,绘制了大量的大理石图,只是为了看看我的代码在哪里, enter image description here

我不知道我创建的图表是否说明了我想要的东西,如果是的话,我不知道为什么示例代码不会像图片肖像那样执行

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

第一部分很好,但地图有点不需要,你正在做的是将每个RequestResult映射到Observable,然后在Observer.onNext()手动订阅它实际上,defer不是必需的,因为您为每个Observable创建了具有不同数据的单独RequestResultdefer将在每个订阅时发生{ {1}},地图会在您对每个压缩onNext()的发射时观察到。 您可能需要的是简单RequestResult将每个flatMap()值映射到将执行网络请求的单独RequestResult,并且它会将每个请求的结果合并回流,因此您只需要处理每个请求的最终值排放,而不是手动订阅每个Observable
请记住,订单可能会丢失,以防某些请求可能需要的时间超过它们之间的延迟。

Observable

答案 1 :(得分:0)

我设法让它工作,就像在Observable.defer中的某个地方,我的改装是null,

retrofitClient.getApiURL().post(request); // client was null

我的retrofitClient为null(我看了代码中的某处,我注意到我没有初始化,我正确地初始化它并使其工作)

现在有人可以告诉我为什么Rx没有将异常抛回到原始的可观察流中吗?没有发生NullPointerException,我很困惑