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

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

從文檔引用數組中獲取 firestore 文檔

從文檔引用數組中獲取 firestore 文檔

jeck貓 2023-01-06 15:46:26
目前,我正在處理一組相當復雜的 firestore 查詢。我試圖同時填充一個包含對其他文檔的引用的數組,然后讀取這些文檔并將信息放入一個數組中。更具體地說,對于這個例子,我在一個集合中有 4 個引用。我想獲取這些引用,然后使用這些引用查詢 4 個文檔并用信息填充一個數組。順序如下:查詢tags子集合中的所有文檔,由以下函數處理:getTagsOnPage(workspaceId: string, pageId: string) {    // get all of the references in the tags sub-collection, and puts them in an array    // get all id's, do not get data    return this.afs      .collection("users")      .doc(`${auth().currentUser.uid}`)      .collection<Workspace>("workspaces")      .doc(`${workspaceId}`)      .collection<Page>("pages")      .doc(`${pageId}`)      .collection("tags")      .snapshotChanges()      .pipe(        map((actions) => {          return actions.map((a) => {            const ref = a.payload.doc.get("reference");            return ref; // return an array of (id: reference) key-value pairs          });        })      );  }這適用于執行訂閱的以下代碼:this.pageService      .getTagsOnPage(this.workspaceId, this.currentPage.id)      .subscribe((data) => {        temp = data;      });data如下,通過控制臺:(3) ["/users/ucB5cF4Pj3PWhRn10c9mvqQbS7x2/workspaces/It1…1tSnPI5GJrniY82vZL/localTags/1p5Tscwn14PyK6zRaFHX", "/users/ucB5cF4Pj3PWhRn10c9mvqQbS7x2/workspaces/It1tSnPI5GJrniY82vZL/localTags/lFKoB0jngmtnALut2QS2", "/users/ucB5cF4Pj3PWhRn10c9mvqQbS7x2/workspaces/It1tSnPI5GJrniY82vZL/localTags/r6sf2SX6v87arU2rKsD5"]現在,執行下一組數據讀取是我開始困惑的地方。我最初的方法是嘗試 for 循環(針對此數組的長度),但這將涉及迭代執行多個嵌套訂閱,我認為從這個意義上講這是不可能的。我是 rxjs 的新手,只使用過 map 和 switchMap 運算符。在這種情況下,我想我會使用mergeMap和/或之類的東西,flatMap,但坦率地說,我不確定在這種情況下如何進行這項工作。此外,處理我需要根據我獲得的 documentReferences 數組獲取文檔的 for 循環也會讓我陷入循環。這是我目前的實現,無處不在;我希望對我正在嘗試做的事情有感覺?;旧希ㄟ^ getTagsOnPage 獲取引用數組,等待 observable 結束,使用 switchMap 獲取數據數組并對其進行循環;理想情況下,訂閱每個 ref 并添加到 tagData凌亂,我知道,但我認為一旦我知道正確的操作員使用它就會更有意義。
查看完整描述

1 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

使用錯誤的原因switchMap是因為您沒有返回 Observable。


當使用任何“高階映射運算符”(switchMap、concatMap、mergeMap 等)時,提供的函數必須返回一個可觀察對象。正如錯誤所述:“類型void不可分配給類型ObservableInput<any>”,您沒有返回任何東西(無效)。


接下來不太正確的是,在您的循環中,您引用ref.snapshotChanges().pipe()了 ,但您從不訂閱它。您可能知道,可觀察對象是惰性的,除非有訂閱者,否則不會觸發。


只要您在 中返回一個可觀察對象switchMap(),它就會自動訂閱它并發出它的值。


讓我們換個角度思考這個問題;而不是遍歷第一次調用的結果,執行它們,然后將值推入數組。相反,我們可以獲取結果并將它們變成一個可觀察的流,該流發出它們各自調用的所有結果,并為您將它們組合成一個數組。但是......有一個微妙的區別:我建議不要tagData在流之外有一個單獨的數組,而是讓你的可觀察對象返回tagData你需要的形式作為Observable<TagData[]>.


我認為這樣的事情對你有用:


tagData$ = this.pageService.getTagsOnPage(this.workspaceId, this.currentPage.id).pipe(

    switchMap(references => from(references)),

    mergeMap(ref => this.afs.doc(ref).snapshotChanges()),      

    map(actions => actions.payload.data()),

    scan((allTagData, tagData) => [...allTagData, tagData], [])

  })

);

讓我們分解一下!

  1. 我們用來from從您的數組中創建一個可觀察對象,它一次發出每個“引用”。

  2. mergeMap將訂閱我們正在創建的可觀察對象并發出它的排放量

  3. map只需將值轉換為您想要的形狀

  4. scan為您累積排放量并在每次更改時排放。如果您不想在所有呼叫返回之前發出信號,請reduce()改用

現在,您可以簡單地執行:tagData$.subscribe()并使用生成的數據數組執行您想要的操作?;蛘吣闵踔量梢栽谀愕哪0逯惺褂?a >異步管道而不是在你的組件中訂閱。


查看完整回答
反對 回復 2023-01-06
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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