Javascript rxjs合并在angular5中未按预期工作 从'rxjs/Observable'导入{Observable}; 导入“rxjs/add/observable/merge”; this.events=this.availableHoursCollection.valueChanges() this.bla=this.afs.collection('用户') .doc('G2loKLqNQJUQIsDmzSNahlopOyk1').collection('availableHours'); this.test=this.bla.valueChanges(); this.something=Observable.merge( 这件事, 这个测试 )

Javascript rxjs合并在angular5中未按预期工作 从'rxjs/Observable'导入{Observable}; 导入“rxjs/add/observable/merge”; this.events=this.availableHoursCollection.valueChanges() this.bla=this.afs.collection('用户') .doc('G2loKLqNQJUQIsDmzSNahlopOyk1').collection('availableHours'); this.test=this.bla.valueChanges(); this.something=Observable.merge( 这件事, 这个测试 ),javascript,angular,typescript,merge,rxjs,Javascript,Angular,Typescript,Merge,Rxjs,这个东西只有最后可观察到的项目,我如何组合它们? 另外,如果您有具有相同值id的观测值,如何合并这些值?使用AngularFire测试台,我为您运行了Rx场景 const merged=Observable.merge(o1,o2) 我得到了一个可观测的,发射两次的,每个发射包含一个数组,它是每个查询的结果 这让我想知道你是如何检查输出的。如果使用异步管道{{results | async}}将管道传输到模板,则第二个发射将覆盖第一个并给人留下只有第二个发射的印象 如果你很清楚的话,我会道歉的

这个东西只有最后可观察到的项目,我如何组合它们?

另外,如果您有具有相同值id的观测值,如何合并这些值?

使用AngularFire测试台,我为您运行了Rx场景

const merged=Observable.merge(o1,o2)
我得到了一个可观测的,发射两次的,每个发射包含一个数组,它是每个查询的结果

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

如果你很清楚的话,我会道歉的

如果需要组合两个阵列的单个发射,可以使用多种方法。此方案的最佳方案是
combinelateest()

const combined=可观察到的组合测试(o1,o2)
.map(([s1,s2])=>[…s1,…s2])
之所以这样做是最好的,是因为
.valueChanges()
旨在不断推动更改,因此它永远不会完成。基于
forkJoin()

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

两者都需要一个完成的事件来发射任何东西,而
CombineTest()
则不需要,并且只要其中一个源被更新,组合的可观测对象就会再次发射。

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

const merged=Observable.merge(o1,o2)
我得到了一个可观测的,发射两次的,每个发射包含一个数组,它是每个查询的结果

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

如果你很清楚的话,我会道歉的

如果需要组合两个阵列的单个发射,可以使用多种方法。此方案的最佳方案是
combinelateest()

const combined=可观察到的组合测试(o1,o2)
.map(([s1,s2])=>[…s1,…s2])
之所以这样做是最好的,是因为
.valueChanges()
旨在不断推动更改,因此它永远不会完成。基于
forkJoin()

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

两者都需要一个已完成的事件来发出任何东西,而
combinelatetest()
则不需要,并且只要其中一个源被更新,组合的可观察对象就会再次发出。

什么是
availableHoursCollection
?它的角度存储:this.availableHoursCollection=this.afs.collection('users').doc(user.uid).收款(“可用小时”);您应该调查对
this.events
this.test
的并行订阅是否都会在不合并的情况下发出更改。您不太可能在与
merge
一样基本的运算符中发现错误。更有可能的情况是,您的代码以您不期望的方式运行(出于某种原因),或者您发现了AngularFire bug。什么是
availableHoursCollection
?它的AngularFireStore:this.availableHoursCollection=this.afs.collection('users').doc(user.uid).collection('availableHours');您应该调查对
this.events
this.test
的并行订阅是否都会在不合并的情况下发出更改。您不太可能在与
merge
一样基本的运算符中发现错误。更可能的情况是,您的代码以您不期望的方式运行-出于某种原因-或者您发现了AngularFire bug。我没有意识到,这对我来说是全新的,非常棒的回答谢谢我明天会尝试这个我没有意识到,这对我来说是全新的,非常棒的回答谢谢我明天会尝试这个
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
)