RxJS map和其他具有Observable的运算符

时间:2018-07-10 12:25:57

标签: angular rxjs angularfire2

在实现以下目标方面存在一些实际问题。我有一个带有函数的服务,该函数返回带有键的事件列表。然后,我想将此键传递给另一个函数,该函数将在其他数据中返回更详细的对象,例如消息数和所有者信息。然后我订阅了组件。

当前,我正在将.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);

感觉就像一团糟,并且不确定构造这部分的最佳方法。

1 个答案:

答案 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)