首页 文章

带有Observable的RxJS Map 和其他运算符

提问于
浏览
1

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

目前我正在使用带有forEach的.map运算符,然后订阅以获取其他信息 . 我想我需要使用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

    我不确定我是否清楚一切,但这可能有所帮助 .

    让我们假设一下

    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) ,它返回完整事件的Observable .

    现在,您使用 mergeMap 运算符(以前称为 flatMap )来查看Observables流并获取完整事件流 . 这意味着

    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)
    

相关问题