【问题标题】:rxjs merge not working as expected in angular5rxjs 合并在 angular5 中无法按预期工作
【发布时间】:2017-12-30 02:47:44
【问题描述】:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/merge';

this.events = this.availableHoursCollection.valueChanges()
this.bla = this.afs.collection<AvailableHour>('users')
  .doc('G2loKLqNQJUQIsDmzSNahlopOyk1').collection('availableHours');

this.test = this.bla.valueChanges();


this.something = Observable.merge(
  this.events,
  this.test
)

this.something 只有最后一个 observable 的项目,我该如何组合它们?
此外,如果您有具有相同值 id 的 observable,如何合并这些值?

【问题讨论】:

  • 什么是availableHoursCollection
  • 它的 Angular Firestore:this.availableHoursCollection = this.afs.collection('users').doc(user.uid).collection('availableHours');
  • 您应该调查对this.eventsthis.test 的并行订阅是否都在未合并的情况下发出更改。您不太可能在像merge 这样基本的运算符中发现错误。您的代码更有可能以您不期望的方式运行 - 出于某种原因 - 或者您发现了 AngularFire 错误。

标签: javascript angular typescript merge rxjs


【解决方案1】:

使用 AngularFire 测试台,我运行了你的 Rx 场景

const merged = Observable.merge(o1, o2)

我得到了一个 observable,它发出两次,每个发出包含一个数组,它是每个查询的结果。

这让我想知道您是如何检查输出的。如果使用异步管道{{ results | async }} 管道到模板,则第二个发出将覆盖第一个并给人以只有第二个发出的印象。

如果您知道这一点,我们深表歉意。

如果您需要组合两个数组的单个发射,有多种方法可以做到这一点。最适合这种情况的是combineLatest()

const combined = Observable.combineLatest(o1, o2)
  .map(([s1, s2]) => [...s1, ...s2])

这是最好的原因是因为.valueChanges() 旨在不断推动更改,因此它永远不会完成。所以基于forkJoin()

的方法
Observable.merge(o1.mergeMap(x => x), o2.mergeMap(x => x)).toArray()

两者都需要 completed 事件来发射任何东西,而 combineLatest() 不需要,并且只要其中一个源被更新,组合的 observable 就会再次发射。

【讨论】:

  • 我不知道,这对我来说都是新的,很棒的答案谢谢我明天试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2017-03-14
相关资源
最近更新 更多