为了账号安全,请及时绑定邮箱和手机立即绑定

RxFire handels firestore如何查询

RxFire handels firestore如何查询

白猪掌柜的 2023-03-10 12:53:23
这个 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 如何处理流式 firestore 查询结果:...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));
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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


“在源 Observable 上应用累加器函数,并在源完成时返回累加结果”——来自文档,请参见此处:RxJS reduce docs


在您的情况下,源不会完成,因为这就是 Firestore 的工作方式,它会无休止地运行而不会完成,直到发生错误或您手动取消订阅。


take(1)举一个粗略的例子,你可以在管道内使用运算符,它会在发出 1 个事件后完成源 Observable,因此它reduce会起作用,但它扼杀了 Firestore Observable 背后的主要思想。


这是您可以使用 rxjs 运算符的方式reduce:


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));


查看完整回答
反对 回复 2023-03-10
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信