Firebase Observable scan() 和 return 如果满足条件

Firebase Observable scan() and return if meets condition

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

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

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

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

使用map然后filter来很好filter文章:

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 的答案更好。