【问题标题】:Ngrx, Rxjs - Merging observable streams returning a new streamNgrx,Rxjs - 合并可观察的流返回一个新的流
【发布时间】:2019-10-05 16:29:00
【问题描述】:

我正在尝试加入两个可观察的流来创建一个我也可以订阅的新流。两个输入流都返回对象数组。我尝试使用 forkJoin 运算符,后跟一个管道图并像这样订阅:

forkJoin(
  this.firstObservable$,
  this.secondObservable$
).pipe(
  map(([first, second]) => {
    // here create a new array array = [] and push new Object { first.something, second.something
    // return newArray
  }
  })
).subscribe((data: any) => {
  this.data = data;
});

但这似乎没有按预期工作。我也用水龙头试过这个。正确的方法是什么?

【问题讨论】:

  • 请详细说明。预期的行为是什么?目前发生了什么?此外,(data: any) => 是非常错误的。如果你去掉注释回调参数类型的可怕做法,TypeScript 会多做 100 倍。说真的,人们,不要再写那样的代码了

标签: angular typescript rxjs ngrx


【解决方案1】:

ForkJoin 本身返回一个你可以订阅的 observable

forkJoin([
  this.firstObservable$,
  this.secondObservable$
]).subscribe(res => {
    //res[0] is the result emitted for the first observable
});

你不需要使用map 来尝试合并它们

【讨论】:

  • 我试过直接订阅它,然后处理输出,但是放在 subscribe 方法中的 console.log 永远不会触发。
  • @PiotrJerzyMamenas 不能在没有看到你的完整代码的情况下发表评论,但你应该看到 medium.com/@swarnakishore/… 以获得整洁的演示
  • forkJoin 仅在所有输入 observable 完成后才发出值,this.firstObservable$ and this.secondObservable$ `完成吗?
  • 尝试使用 combineLatest 代替(如果您的输入 observables 未完成)
  • @izmaylovdev 我链接了可观察对象,在组件构造函数中我调用了可观察对象的 tap 方法,但它们也没有被订阅。我只是将它们传递给组件的 onInit 部分中的 forkJoin。
【解决方案2】:

Rxjs 提供了几个用于组合流的运算符(您可以找到此运算符的列表 here),在您的情况下,我可以推荐您使用 combineLatest 或 forkJoin,具体使用取决于输入 observables 的类型

forkJoin - 当所有 observables 完成后,发出每个 observables 最后发出的值。

combileLatest - 当任何 observable 发出一个值时,发出每个 observable 的最新值

注意:ngrx 选择器未完成,如果您的输入 observables 是 ngrx 选择器,请使用 combineLatest

【讨论】:

  • 对不起我的英语
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2019-03-29
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多