亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號