【问题标题】:RxJS map & other operators with ObservableRxJS 映射和其他带有 Observable 的操作符
【发布时间】:2023-03-13 03:55:01
【问题描述】:

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

目前我正在使用带有 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);

感觉一团糟,不确定如何组织这部分。

【问题讨论】:

    标签: angular rxjs angularfire2


    【解决方案1】:

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

    我们假设

    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)来展平 Observable 流并获得完整事件流。这意味着

    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)
    

    【讨论】:

    • 非常感谢您的快速回复。我已经尝试过了,但它在 switchMap 行的“来自”上出错。除了 Array.from 之外,我找不到它的来源?抱歉,我已经尝试过 Array.from 并且编译错误消失了,现在只是尝试处理您的代码。将报告回来(y)
    • 这确实让我更接近了。现在的不同之处在于,如果我在组件中订阅,我会得到一个(完整的)事件对象流,而不是我之前订阅的列表(this.completeEvents = events)样式。我试图将这些推送到组件中的新数组上,但问题(当我尝试推送时)是如果另一个用户更改了一个事件,这会创建多个新的对象。 TLDR:上面的代码中是否有返回要在组件中订阅的 Event 对象数组?
    • from 是 RxJs 6 中的一个函数。如果您使用的是 RxJs 5.x,那么您可以使用 import { from } from 'rxjs/observable/from' 导入它
    • 试试toArray运营商
    • 谢谢,添加了有效的 from 导入。在 .switchMap 下添加了 .toArray() 但它出错(this.afs.collection...toArray 不是函数)。目前正在查看过去有关 SO 的问题,但如果您对如何解决问题有任何指导,那就太好了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2017-05-13
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多