【问题标题】:Angular - How to use the result of an observable, inside another observable?Angular - 如何在另一个可观察对象中使用可观察对象的结果?
【发布时间】:2020-06-03 13:13:01
【问题描述】:

我有一个 observable,我订阅了它,并对结果值(reduce()map())进行了一些操作。

但是在那个 observable 中,我想调用另一个 observable,它只返回一个数字,我需要在我的 map() 中使用这个数字。

这里是一个例子:

this.getYearlyDataByIdAndYear(292, 2019).subscribe(result = > {
        let ferienSaldo: FerienSaldo;
        this.getVacationsYearlyDataByIdAndYear(292, 2019).subscribe(result = > {
            // this is my inner observable and I need to save this result, and use it below!
            ferienSaldo = result;
        });
        this.yearlyOverview = result.reduce < Array < YearlyOverview >> ((prev, current, i, all) = > {
                // some code that is not important
                let overviewVar: YearlyOverview = {
                    saldo: ferienSaldo.value
                };
                prev.push(newTLOverview);
            }
            return prev;
        }, new Array < YearlyOverview > ())
});

基本上如您所见,在我的初始 Observable 中,我需要来自内部的值,我将在 reduce() 中复制该值,以将其分配给我正在创建的新对象!

我的代码的问题是,“let ferienSaldo”变量无法在第二个 observable 中访问,除此之外,我确信还有更好的方法来组合它!

【问题讨论】:

    标签: angular observable


    【解决方案1】:

    看起来这两个调用并不相互依赖,因此您可以在 forkJoin 中并行运行它们

    forkJoin([
      this.getYearlyDataByIdAndYear(292, 2019).pipe(
        tap(result => this.result1 = result)
      ),
      this.getVacationsYearlyDataByIdAndYear(292, 2019).pipe(
        tap(result => this.result2 = result)
      )
    ]).subscribe(() => {
      // process this.result1 and this.result2
      // TODO: more meaningful property names
    });
    

    编辑:

    我使用 Tap 是因为我喜欢保持订阅主体的清洁。也可以将结果返回数组进行订阅:

    forkJoin([
      this.getYearlyDataByIdAndYear(292, 2019),
      this.getVacationsYearlyDataByIdAndYear(292, 2019)
    ]).subscribe(result => {
      // process result[0] and result[1]
    });
    

    第二个选项在像这样的简单示例中看起来更简洁,但我发现将您的订阅主体与数组索引结合起来很烦人 - 尤其是在您进行更改时。

    【讨论】:

    • 没错,这两个调用不相互依赖,它们只是使用相同的参数,而内部是一个小调用,它只是从另一个数据库返回一些值,我会尝试然后你的叉子加入
    • 很好用,唯一的问题是,在将“(结果:[])”更改为“(结果)”之前,我遇到了一个错误!现在我可以调用 result[0] 和 result[1],谢谢
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2021-10-31
    相关资源
    最近更新 更多