【问题标题】:Firebase Observable scan() and return if meets conditionFirebase Observable scan() 并在满足条件时返回
【发布时间】:2018-03-05 01:01:40
【问题描述】:

在 Firebase 我有文章对象,例如:

articles
 UNIQUE_KEY
  title: 'Some title'
  validUntil: '2017-09-29T21:00:00.000Z'
 UNIQUE_KEY
  title: 'Other title'
  validUntil: '2017-10-29T21:00:00.000Z'

现在我想带上那些validUntil(日期)仍然即将到来的人,所以我愿意:

  getValidArticles(): Observable<Article[]> {
    return this.afDb.list('articles').do(console.log)
      .scan((article) => { 
        if (new Date(article.validUntil).getTime() >= new Date().getTime()) {
          return article;
        }
      })
  } 

看起来效果很好,但是正如您在该函数中看到的我 .do(console.log) ,奇怪的是我在控制台中得到了两个输出 - 两个相同的对象。我做错了吗?

【问题讨论】:

    标签: angular typescript firebase-realtime-database observable angularfire


    【解决方案1】:

    我不确定您的代码为什么不起作用。但即使它可以工作,它也不太理想:您正在下载所有数据,然后删除客户端上的过时数据。这意味着您正在下载用户看不到的数据,这是一种浪费。

    我建议改为过滤服务器上的数据,如AngularFire2 documentation 所示:

    return this.afDb.list('articles', {
      query: {
        orderByChild: 'validUntil',
        startAt: '2017-09-29T21:00:00.000Z' 
      }
    });
    

    【讨论】:

      【解决方案2】:

      使用地图然后过滤来很好地过滤文章:

      getValidArticles(): Observable<Article[]> {
        return this.afDb.list('articles')
          .map((articles) =>
            articles.filter((article) =>
              new Date(article.validUntil).getTime() >= new Date().getTime()));
      }
      

      您可能会收到两个 console.logs,因为您订阅了 observable 两次。

      我不是 AngularFire 专家,所以如果 observable 无法过滤服务器端,那么 Frank van Puffelen 的答案会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2021-05-03
        • 2020-09-12
        • 2020-01-11
        • 1970-01-01
        • 2022-10-06
        • 2022-12-10
        相关资源
        最近更新 更多