当前位置: 首页 > 知识库问答 >
问题:

RXJS我如何在另一个中使用一个可观察的结果(然后一起处理这两个结果)

鄢承运
2023-03-14

在使用RxJs时,一个非常常见的问题似乎是希望一个或多个观测值的结果在后续的观测值中使用它们。

e、 g.在伪代码中(这不是rx或有效的js语法)

var someResult = $observable-A; // wait to complete
var finalResult = $observable-B(someResult.aValueINeed);

这可以通过一种丑陋的方式来实现,你可以订阅这两个网站,然后在另一个网站中调用其中一个。。然而,这是非常混乱的,不能给你太多的灵活性。

例如(真实语法)

$observable-A.subscribe(resultA => { 
    $observable-B(resultA.aValueINeed)
        .subscribe(resultB => { 
            console.log('After everything completes: ', resultB); 
        }
}

这也意味着,当您完成这两个可观察的内容时,没有任何其他内容可以轻松地使用此流。

我的特定用例需要以下内容:

  1. 一个初始调用来获取$观察-A,因为它不需要任何其他东西(这是一个基本的超文本传输协议GET调用)
  2. 对另一个服务的超文本传输协议GET调用,需要从$观察可观察-A返回$观察可观察-B的数据
  3. 使用两个可观察结果(A B)为我的服务创建一个对象(在我的例子中,是一个Angular服务)来返回一个列表。

我还需要能够在我的服务中订阅这个功能,这就是为什么使用上面的订阅方法对我不起作用。

共有1个答案

茹航
2023-03-14

Snore Danielsen解决了这个问题,这一解决方案完全归功于他。我建议你看看这个。

rxjs运营商的最大优点是它们的互操作性。您可以混合和匹配几乎所有内容,以获得您想要的结果。

总之。这个问题的代码答案如下,我将进一步解释它。

$observable-A.pipe(
    mergeMap(resultA => {
        return combineLatest(
            of(resultA),
            $observable-B(resultA)
        )
    }),
    map(([resultA, resultB]) => {
        // you can do anything with both results here
        // we can also subscribe to this any number of times because we are doing all the processing with
        // pipes and not completing the observable
    }
)

mergeMap(或别名为phaMap)将一个可观察的作为输入,并将其投影(就像一个常规的map函数)。这意味着我们可以使用它的结果作为$观测-B的输入。现在,这是非常好的,当你实际上只想返回第二个可观察的结果。

$observable-A.pipe(
    mergeMap(resultA => $observable-B(resultA)),
    map((resultB) => {
        // resultA doesn't exist here and we can only manipulate resultB
    }
)

现在,回到主要解决方案<代码>组合测试是这里的关键。它允许mergeMap基本上“等待”内部可观察($observable-B)完成。如果没有它,您只需要在管道中向您的下一个rxjs操作符返回一个可观察的对象,这不是我们想要的(因为您希望在管道中处理常规操作符函数)。

正因为如此,我们可以将这些新的合并的观测值带到链的下一部分,并一起使用它们。我们使用of()函数重新创建resultA,因为combinerelatest仅将可观察对象作为输入,并且resultA在此状态下是一个完整的可观察对象。

提示:请看一下映射([resultA,resultB])。我们之所以使用此符号来引用变量,而不是标准的map(results),是因为我们可以直接引用它们,而不必使用results[0]来引用resultsresults[1]用于resultB。这样读起来容易多了。

我希望这对人们有所帮助,因为我还没有找到一个完整的SO答案来涵盖这个案例。编辑是非常受欢迎的,因为它很复杂,我相信这不是一个完美的答案。

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

  • 在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。 服务: 组成部分: 我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步

  • 我想我一定是误解了一些基本的东西,因为在我看来,这应该是一个可观察事物最基本的情况,但在我的一生中,我无法从文件中找出如何做到这一点。 基本上,我希望能够做到这一点: 但是我一直没能找到像这样的方法。我将此用于单击处理程序,我知道他们有,但我正试图将其与React一起使用,我宁愿能够简单地在回调中更新数据流,而不是使用完全不同的事件处理系统。所以基本上我想要这个: 我得到的最接近的是使用,但这似乎

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

  • 我需要使用以下规则将两个可观察到的东西A和B组合起来: 组合可观察物的类型必须是 A可以多次发射或不发射 B可能发射1次或不发射 只要B没有发射任何东西,组合的可观测物就不会发射任何东西。 当B发射时,如果A已经发射,则A的最后结果将由组合可观测器发射。如果A尚未发出,将发出。 我尝试过使用,但是如果A还没有发出,这就不起作用了。我还尝试了并执行,但我无法从转换为 在RXJava2中是否可以创建这

  • 我使用Redux和RxJS Angular(4)实现来管理状态 我正在监听一个事件(产品列表中选定产品ID的更改),所以我们称之为selectedproductId$。 当相关发射器发出一个新的selectedId值时,我想从这个可观察值中执行一个,以及从另外两个可观察值中发出的最新值(比如;和)。 因此,触发更改应该是selectedproductID,我们将使用product详细信息和prod