【问题标题】:RXJS Nested dependant subscriptionsRXJS 嵌套依赖订阅
【发布时间】:2020-02-26 19:05:35
【问题描述】:

我正在尝试使用 Observables 来解决问题。但我在挣扎。我已经用谷歌搜索了一段时间,但我无法确定我看到的示例是否符合我的尝试。

我会试着解释一下,所以也许有人可以给我解释一下。

我有这个 http 端点,我向它发布了一个 JSON 对象。后端存储它,并返回带有 id 的持久对象。然后根据我在这里得到的响应,我需要通过调用第二个 http 端点来更新对象。

假设 service1 是帖子或创建对象,service2 用于更新它。然后我会做以下事情:

service1.create(theNewObject).subscribe(response => {
   service2.update(response).subscribe(secondResponse => { console.log(secondResponse) })
})

我很确定这可以做我想做的事情,但是我在某处读到过在另一个订阅中进行订阅不是这样做的方法。

所以我的问题是.. 如果我不能这样做,这里该怎么办?

这让我很难理解..

提前致谢!

【问题讨论】:

    标签: rxjs rxjs-observables


    【解决方案1】:

    您使用所谓的高阶运算符:

    import {switchMap} from 'rxjs/operators'; // import the operator
    
    service1.create(theNewObject).pipe(
      switchMap(response => service2.update(response))
    ).subscribe(secondResponse => { console.log(secondResponse) })
    

    高阶运算符通常涉及外部和内部可观察对象。他们将从外部 observable 接收值(在本例中为创建)并订阅返回的内部 observable(在本例中为更新)并输出内部的值。

    其中有许多用例/行为略有不同,但switchMap 是最常见的。在处理单发射 observables(如 http 调用)时,它们的行为都相同。

    嵌套订阅通常被认为是 rxjs 中的一种反模式,应避免使用,因为它们会使正确管理订阅变得困难或混乱,这对于您深入了解 rxjs 很重要。不存在需要嵌套订阅或无法由高阶运算符处理的用例。

    【讨论】:

    • 感谢@bryan60 提供了如此详尽的答案。只是一个关于继续前进的快速问题 - 在 switchMap 内部,如果我想在将响应值与 service2.update 一起使用之前操纵它怎么办?类似 switchMap(response => { response.someNewProperty = 'whatever'; service2.update(response)}) 尝试过,但似乎不是正确的方法。
    • 只要确保你返回你想要订阅的内部 observable。
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2020-08-18
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多