Firebase Observable scan()并在满足条件时返回

时间:2017-09-23 16:28:38

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

在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)那样奇怪的是我在控制台中得到两个输出 - 两个相同的对象。我做错了吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

使用地图然后过滤到过滤文章:

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

你可能得到两个console.logs,因为你订阅了两次可观察量。

我没有AngularFire专家,所以如果观察者无法过滤服务器端,那么Frank van Puffelen的答案会更好。