当前位置: 首页 > 面试题库 >

合并一个可观察对象列表,然后等待所有完成

欧阳飞
2023-03-14
问题内容

TL; DR 如何转换Task.whenAll(List<Task>)RxJava

我现有的代码使用Bolts构建了一系列异步任务,并等待所有这些任务完成后再执行其他步骤。本质上,它会构建a
List<Task>并返回一个列表,当Bolts站点上的示例按照列表中的 所有 任务Task完成时,将其标记为已完成。
__

我正在寻找替换方法BoltsRxJava并且我假设这种方法可以构建异步任务列表(大小未知)并将它们全部包装为一个Observable,但是我不知道如何。

我试着看mergezipconcat等…但不能去工作的List<Observable>,我会被建立,因为他们似乎都面向工作的只有两个Observables,如果我理解正确的文档在一个时间。

我正在尝试学习RxJava,但仍然很陌生,因此如果这是一个明显的问题或在文档中的某个地方进行了解释,请原谅我;我尝试搜寻。任何帮助将非常感激。


问题答案:

听起来您正在寻找Zip运算符。

有几种不同的用法,让我们来看一个例子。假设我们有一些不同类型的简单可观察物:

Observable<Integer> obs1 = Observable.just(1);
Observable<String> obs2 = Observable.just("Blah");
Observable<Boolean> obs3 = Observable.just(true);

等待他们全部的最简单方法是这样的:

Observable.zip(obs1, obs2, obs3, (Integer i, String s, Boolean b) -> i + " " + s + " " + b)
.subscribe(str -> System.out.println(str));

请注意,在zip函数中,参数具有与要压缩的可观察对象类型相对应的具体类型。

也可以直接压缩可观察对象的列表:

List<Observable<?>> obsList = Arrays.asList(obs1, obs2, obs3);

Observable.zip(obsList, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));

…或通过将列表包装到中Observable<Observable<?>>

Observable<Observable<?>> obsObs = Observable.from(obsList);

Observable.zip(obsObs, (i) -> i[0] + " " + i[1] + " " + i[2])
.subscribe(str -> System.out.println(str));

但是,在这两种情况下,zip函数只能接受一个Object[]参数,因为列表中的可观察对象的类型及其数量是未知的。这意味着zip函数必须检查参数的数量并进行相应的转换。

无论如何,以上所有示例最终都会打印出来 1 Blah true

编辑:
使用Zip时,请确保Observables所有被压缩的拉链发出相同数量的项目。在以上示例中,所有三个可观察对象都发出了一个项目。如果我们要将它们更改为以下内容:

Observable<Integer> obs1 = Observable.from(new Integer[]{1,2,3}); //Emits three items
Observable<String> obs2 = Observable.from(new String[]{"Blah","Hello"}); //Emits two items
Observable<Boolean> obs3 = Observable.from(new Boolean[]{true,true}); //Emits two items

然后1, Blah, True2, Hello, True是传递到zip函数中的唯一项目。3由于其他可观察物均已完成,因此该项目永远不会被压缩。



 类似资料:
  • 问题是 我有一个活动,它定期从API获取数据并显示收到的数据。API 使用 OAuth,因此我会收到一个临时访问令牌,该令牌在一段时间(1 小时)后过期。如果应用尝试使用过期的令牌获取数据,则显然请求将失败。在我的应用的早期迭代中,我对网络请求使用 AsyncTasks,基本上只是执行了一个新的异步任务,该任务将在调用从服务器获取数据的主异步任务之前获取新的访问令牌。这工作得很好,因为主要的Asy

  • 我把可观测的物体放入这样的阵列中。。。 我想要一个可观测的,当所有任务$完成时发出。请记住,在实践中,任务$没有已知数量的可观察对象。 我试过,但如果只有一个任务,这似乎失败了,这让我相信ZIP需要偶数个元素才能按预期的方式工作。 我已经尝试了Observable.concat(任务$)。订阅(),但是Conconat运算符的结果似乎只是一个可观察的数组...例如,基本上与输入相同。你甚至不能订阅

  • 我正在努力理解如何合并两个可观察对象并利用它们合并后的产品。我在mergeMap、switchMap、flatMap、大理石图等上看了无数视频,但我仍然不知道合并观测值是如何工作的。我觉得在使用RxJS的时候,我不会有效率,甚至不会正确。 我有一个要订阅的可观测值,我还想订阅代码中特定表单数组的valueChanges可观测值。但是,我需要确保只有在正确构建表单数组之后才能进行第二次订阅,否则将出

  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1

  • 问题内容: 我正在尝试在JavaFX 8中创建一个,需要一个。我不知道如何创建一个……但是,如果我尝试: 我收到一个错误消息,说它无法实例化,因为它是抽象的。可以理解的 如果我查看该文档,可以看到,但是我做不到: 因为没有适用的构造函数。显然我需要传递给,这很奇怪,因为我无法创建。 我不确定如何解密。如果我尝试 出于绝望,我得到了一个更加复杂的错误。 也不起作用。它以某种方式起作用(但显然使用了不

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块