【问题标题】:why map with condition return always value为什么带有条件的映射总是返回值
【发布时间】:2020-05-04 16:15:49
【问题描述】:

我正在使用 rxjs 映射来检索 Firestore 中的数据,如下所示:

  getArtists(): Observable<DocumentData> {
    const users$ = this.firestore.collection('/Users').get()
    users$.subscribe((users) => {
      users.docs.map(user => user.data().artistName !== "" && user.data().role === 'ARTIST')
    });
    return users$;
  }

但是当我得到这样的价值时:

this.userService.getArtists().subscribe(
      (userDocs) => {
        userDocs.docs.map((user) => {
          this.artists.push(user.data());
          console.log(this.artists)
          this.record = this.artists.length;
        })
      });

当艺术家名称等于"" 并且角色不等于'ARTIST' 时,它总是返回用户。 为什么?

谢谢大家!

【问题讨论】:

    标签: dictionary rxjs rxjs-observables


    【解决方案1】:

    您需要在map 运算符而不是subscription 中映射数据,并将值作为管道返回。 不幸的是,在您的代码中并不清楚您想要过滤什么以及何时过滤,为什么userusers.docs 中,而它往往是doc

    请查看下面的示例,并考虑使用更多信息更新您的问题。

    import {filter, map} from 'rxjs/opreators';
    
      getArtists(): Observable<DocumentData> {
        return this.firestore.collection('/Users').get().pipe( // <- use pipe
           map(users => {
              // here some changes in users if we need.
              return users;
           }),
        ),
        filter(users => {
          returns true; // or false if we don't want to emit this value.
        }),
      }
    

    【讨论】:

    • 我这样解决:getArtists(): Observable { return this.firestore.collection('/Users').get().pipe( map((users) => users. docs.filter(user => user.data().artistName !== "" && user.data().role === 'ARTIST').map(user => user) )) }
    • 但是如何在我的组件中获取管道的值?
    • 与您在代码中通过subscribe = this.userService.getArtists().subscribe 执行的操作相同。目标是仅在您需要在某处显示数据时订阅。如果您需要过滤/转换/加入等 - 使用管道。您评论中的解决方案很好,但.map(user =&gt; user) 是多余的,它不会改变任何东西。
    猜你喜欢
    • 2021-03-31
    • 2012-06-24
    • 2019-12-05
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多