【问题标题】:Chain Observable RxJs in AngularAngular 中的链式 Observable RxJ
【发布时间】:2020-08-13 13:18:31
【问题描述】:

我使用 RxJs 6.6.0 和 Angular 9。

我有两个函数返回 Observable 和 Observable。

所以我习惯:

funcA().subscribe(x=>{ // do something...});

funcB().subscribe(x=>{// do somethings..});

但我只需要在 funcA() 完成时调用 funcB。我看到 concat 可能会有所帮助,但我无法得到这样的两个答案

concat(funcA,funcB).subscribe( (x,y)=>{// do with x
//do with y});

我想这样做是因为 funcB 的参数取决于 funcA 的返回。

【问题讨论】:

    标签: angular rxjs rxjs-observables


    【解决方案1】:

    使用来自 rxjs/operators 的switchMap 来实现它。

    this.sub = funcA()
      .pipe(
        switchMap(valueFromA => {
          // use valueFromA in here.
          return funcB()
        })
      )
      .subscribe();
    

    【讨论】:

    • 为什么要使用switchMap
    • 因为:在每次发射时,先前的内部 observable(您提供的函数的结果)被取消,并订阅了新的 observable。
    • mergeMap的情况下,您必须手动控制内部订阅。通过使用switchMap,它会自动取消。如果您忘记手动取消订阅,这有助于避免内存泄漏问题。 MergeMap Docs
    • @VaritJPatel valuefromA 需要分配给我给 funcB 的对象的字段,而不是直接给出值。记住比 FuncB 返回一个可观察对象
    • @Arno 我向你展示了如何使用 valuefromA 的值来调用 funcB()。
    【解决方案2】:

    尝试通过以下方式实现它:

    import {  mergeMap } from 'rxjs/operators';
    
    funcA()
      .pipe(
         mergeMap(valueFromA => {
             funcB({value: valueFromA }))
         }
       )
      .subscribe(console.log);
    

    【讨论】:

    • 我不能使用 funcA 的返回值,我需要将此值分配给我给 funcB 的对象
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多