1 回答

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));
添加回答
舉報