在实现以下目标方面存在一些实际问题。我有一个带有函数的服务,该函数返回带有键的事件列表。然后,我想将此键传递给另一个函数,该函数将在其他数据中返回更详细的对象,例如消息数和所有者信息。然后我订阅了组件。
当前,我正在将.map运算符与forEach结合使用,然后通过subscribe获取其他信息。我想我需要使用switchMap(以删除内部订阅),但是我一生都无法使用它。还尝试了flatMat,MergeMap,forkJoin和Observable.from,但让我感到困惑。相关的代码开头如下
return this.afs.collection<Event>(`users/${this.currentFirebaseUserObj.uid}/eventsByUser`)
.valueChanges()
.map((allEvents) => {allEvents.forEach(event =>{
现在,我想返回getCompleteEvent()
函数的结果,该函数返回一个Event类型的Observable来替换上述事件对象,我想我需要订阅它,但是如何返回第二次调用的结果,并替换第一个事件对象,即
this.getCompleteEvent(event.key).subscribe(completeEvent => {
return completeEvent
}
另一方面,我可以通过不同的函数将特定字段添加到forEach中的事件对象,但是希望有一个getComplete
函数在订阅即返回后返回整个对象。
event.userOwnerObj = this.getUserObject(event.ownerId);
event.noOfMessage = this.getNoOfMessages(event.key);
感觉就像一团糟,并且不确定构造这部分的最佳方法。
答案 0 :(得分:0)
我不确定是否一切都清楚,但这可能会有所帮助。
让我们假设
this.afs.collection<Event>(`users/${this.currentFirebaseUserObj.uid}/eventsByUser`).valueChanges()
返回一个Observable,该对象至少在事件的初始配置中(即具有键而不是所有细节)发出具有所有事件的集合。
如果是这种情况,请考虑以下代码
this.afs.collection<Event>(`users/${this.currentFirebaseUserObj.uid}/eventsByUser`).valueChanges()
.switchMap(allEvents => from(allEvents))
这返回一个流,该流针对allEvents
中的每个事件发出。现在,对于每个事件,您都可以运行this.getCompleteEvent(event.key)
,它返回 complete事件的Observable。
现在,您可以使用mergeMap
运算符(以前称为flatMap
)来展平可观察对象流并获取完成事件流。这意味着
this.afs.collection<Event>(`users/${this.currentFirebaseUserObj.uid}/eventsByUser`).valueChanges()
.switchMap(allEvents => from(allEvents))
.mergeMap(event => this.getCompleteEvent(event.key))
.subscribe(completeEvent => console.log(completeEvent) // do stuff with completeEvent)