RxJS 使用 snapshotChanges() 的方式是啥?

Posted

技术标签:

【中文标题】RxJS 使用 snapshotChanges() 的方式是啥?【英文标题】:What is the RxJS way of working with snapshotChanges()?RxJS 使用 snapshotChanges() 的方式是什么? 【发布时间】:2021-09-26 08:12:34 【问题描述】:

所以我有一个 auth.service.ts、crud.service.ts 和一个 components.ts。虽然我编写的代码有效,但它恰好是多个教程和文档的组合。我想知道如何组合下面的代码以使其整洁,并且所有逻辑仅在 crud.service.ts 中使用 rxjs 运算符发生。最终结果将返回一个完全格式化的可观察项目集合。

crud.service.ts 

 getTasks() 
   return this.auth.user$.pipe(
    switchMap((value: any) => this.db.collection(`users/$value.uid/tasks`).snapshotChanges())
  )

component.ts

ngOnInit(): void 
    this.fireService.getTasks().subscribe((a: any) => 
      this.tasks = []
      a.forEach((b: any) => 
        let item: any = b.payload.doc.data();
        item.id = b.payload.doc.id;
        item.defaultState = true
        this.tasks.push(item)
      )
    )

【问题讨论】:

您可以在管道中使用map 运算符并将代码的item 部分移到那里。在您的订阅中,您只需分配 tasks 数组。 如果您可以发布工作代码作为答案,我可以立即接受并关闭问题:) 【参考方案1】:

您的服务应该处理数据并对其进行整形:

 getTasks() 
   return this.auth.user$.pipe(
    switchMap((value: any) => 
    this.db.collection(`users/$value.uid/tasks`).snapshotChanges()),
    map( (val) => 
           val.map( (inner) => 
              let item: any = b.payload.doc.data();
              item.id = b.payload.doc.id;
              item.defaultState = true;
              return item;
            ))
  )

在您的订阅中,您只需分配值。

ngOnInit(): void 
    this.fireService.getTasks().subscribe((a: any) => 
      this.tasks = a;     
    )

【讨论】:

它说 switchMap 由于某种原因是一个不推荐使用的符号?此外,代码似乎不起作用 :( 真的很抱歉,但我对 ReactiveX 的概念不熟悉。 我其实尝试了很多其他的方法,问题表面上看起来很简单,但可能有点复杂。 @ParthSandeepAgarwal 它说已弃用,因为我忘记在.snapshotChanges() 之后放置)

以上是关于RxJS 使用 snapshotChanges() 的方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 snapshotChanges() 或 valueChanges() 中获取添加的对象?

AngularFire firestore get / snapshotchanges / valuechanges 对 observable 的操作不是异步的吗?

angularfire2@5.0.0-rc.10 .snapshotChanges() 不能让你得到 doc.payload.doc.data()

如何理解 RxJS?RxJS的中文API和使用教程

如何在不需要 rxjs-compat 的情况下只导入 RxJS 6 中使用的运算符,如旧的 RxJS?

rxjs 基础使用