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