RxFire如何处理消防商店查询



这个js-reduce可以很好地处理查询结果:

function toc(current) {
return {....};
};
function getToc(data) {
return = data.reduce((a, c) => Object.assign(a, {[c.id]: toc(c)}), {});
};
const query = db.collection(normCollection)
.where('a_id', '==', a_id )
.where('year', '==', year) 
.orderBy("id");
subscriptionNorm = collectionData(query, "id")
.subscribe(data => console.log(getToc(data)));

但当我使用RxJs reduce时,它就停止工作了。这与流的末端有关,但是。。。但我不明白RxFire/RxJs是如何处理流式消防商店查询结果的:

...
subscriptionNorm = collectionData(query, "id")
.pipe(reduce((a, c) => Object.assign(a, {[c.id]: toc(c)}), {}))
.subscribe(data => console.log(data));

更新此项工作正常,但是…:

...
subscriptionNorm = collectionData(query, "id")
.pipe(
map(v => v.reduce((a, c) => 
Object.assign(a, {[c.id]: toc(c)}), {})
),
)
.subscribe(data => console.log(data));

您对rxjs reduce运算符的假设是正确的。

"在源Observable上应用累加器函数,以及当源完成"-"时返回累加结果从文档中,请参阅此处:RxJS减少文档

在您的情况下,源代码不会完成,因为Firestore就是这样工作的,它一直在无休止地运行,直到出现错误或您手动取消订阅。

举个粗略的例子,您可以在管道内使用take(1)操作符,它将在发出1个事件后完成源Observable,因此reduce将工作,但它扼杀了FirestoreObservable背后的主要思想

这是您可以使用rxjsreduce运算符的方法:

subscriptionNorm = collectionData(query, "id").pipe(
switchMap(data => from(data).pipe(
reduce((a, c) => Object.assign(a, { [c.id]: toc(c) }), {})
)),
).subscribe(data => console.log(data));

这是可能的,因为我正在切换到from(data),内部Observable将完成,因此reduce操作符将按您的意愿工作。

但是,老实说,这太过分了,你可以简单地保持你已经实现的方式

subscriptionNorm = collectionData(query, "id").pipe(
map(data => data.reduce((a, c) => Object.assign(a, { [c.id]: toc(c) }), {}))),
).subscribe(data => console.log(data));

相关内容

  • 没有找到相关文章

最新更新