【问题标题】:Observable nested callbacks可观察的嵌套回调
【发布时间】:2020-01-11 07:00:20
【问题描述】:

我有一个相对复杂的嵌套可观察对象,它切换到其他可观察对象,并且需要从每个先前的可观察对象返回的信息。比如:

of(1).pipe(
  switchMap(res =>
    of(2).pipe(
      switchMap(res2 =>
        of(3).pipe(
          switchMap(res3 => {
              console.log(res)
              console.log(res2)
              console.log(res3)
              return of()
            }
          )
        )
      )
    )
  )
)

有没有办法在没有 switchmaps 的嵌套回调的情况下实现这一点?主要问题是必须记住每个嵌套 observable 发出的值。

【问题讨论】:

  • 你真的需要父 observables 的值吗?对于这种特殊情况,我认为您只需要第一个,因为所有其他值都是从第一个派生的。你能提供一个更有代表性的例子来说明你的问题吗?如果你需要它们并且它们都是完全独立的可观察对象,你可以使用combineLatest 或其他东西。
  • 我已经更新了示例,但概念保持不变。这实际上只是嵌套回调的问题。

标签: typescript rxjs observable


【解决方案1】:

当然。您需要做的就是重新发送以前的值:

of(1).pipe(
  switchMap(res => of({ res1: res, res2: 2 })),
  switchMap(res => of({ ...res, res3: 3 })
).subscribe(...)

of(1).pipe(
  switchMap(res1 => of(2).pipe(map(res2 => ({ res1, res2 }))),
  switchMap(res => of(3).pipe(map(res3 => ({ ...res, res3 })))
).subscribe(...)

【讨论】:

  • 这是一种常见的做法吗?对我来说,这似乎比嵌套管道更清洁,但我想知道其他人是否会发现这种做法更复杂。
【解决方案2】:

我认为这可以完成这项工作:

of(1).pipe(
  switchMap(res => forkJoin(of(res), of(2))), // Returns [1, 2]
  switchMap(res => forkJoin(...res.map(v => of(v)), of(3))), // forkJoin(of(1), of(2), of(3))
  switchMap(res => forkJoin(...res.map(v => of(v)), of(4))),
).subscribe(console.log) // 1, 2, 3, 4]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 2022-11-25
    • 2020-08-28
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多