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

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

如何將 RXJS 中的嵌套調用展平并最終調用最后一個調用?

如何將 RXJS 中的嵌套調用展平并最終調用最后一個調用?

FFIVE 2023-05-11 16:37:49
我們如何最好地壓平下面的電話。RxJS 的新手,試圖了解應該如何簡化它。閱讀 flatMap、forkJoin、switchMap 和 mergeMap,在下面沒有找到正確的集成路徑,也不確定在下面的場景中哪個是最好的。const useful = [];a.get('abc').subscribe((abcdatas) => {   abcdatas.forEach(abcdata => {     if(abcdata.exist) {        b.get('def').        subscribe((defdatas) => {           useful.push(defdatas.someval);        });      }    }); })if(useful.length) { c.get('ghi'). subscribe((ghidata) => {   completed... });}更新在這里更新我的問題并感謝所有回復。有用的是一個全局結果數組,在我的例子中應該從嵌套調用中填充。最后應該傳遞給最后一個調用。我正在嘗試的步驟:a.get() => 返回數據b.get(adataset) => 如果數據集具有存在屬性,則應為每個數據集執行請求,并填充稍后將使用的有用數組c.get(useful) => 應該觸發并退出。
查看完整描述

3 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

switchMap使用類似或 的映射函數mergeMap將一個請求的結果映射到下一個請求。用于forkJoin同時執行多個請求。


所以對于一對多的場景,一般的想法是:


firstRequest().pipe(

  switchMap(results => forkJoin(results.map(r => nextRequest(r))))

)

對于你的情況,這將是這樣的:


useful = [];


a.get('abc').pipe(

  switchMap(abcdatas => forkJoin(getUseFulRequests(abcdatas))),

  tap(useful => useful.forEach(u => this.useful.push(u))),

  switchMap(useful => useful.length ? c.get('ghi') : EMPTY)

).subscribe((ghidata) => {

  completed...

});



function getUseFulRequests(abcdatas: AbcData[]): Observable<SomeVal>[] {

  return abcdatas.reduce((acc, abcdata) => {

    if (abcdata.exist) {

      const request = b.get('def').pipe(

        map(defdatas => defdatas.someval)

      )

      acc.push(request);

    }

    return acc;

  }, []);

}

getUseFulRequests(abcdatas)如果返回一個空數組或 ,這將不會發出任何東西useful.length == 0。


查看完整回答
反對 回復 2023-05-11
?
茅侃侃

TA貢獻1842條經驗 獲得超21個贊

我認為你正在嘗試做的是:


a.get("abc").pipe(

  mergeMap((abcdatas) => abcdatas.filter((abcdata) => abcdata.exist)), // let's create a stream with all those useful abcdata

  mergeMap(abcdata => b.get('def')), // and for each one of those we perform a b.get request

  toArray(), // once all the b.get requests have completed, emit a one value stream with an Array of those values values

  concatMap(useful => useful.length ? c.get('ghi') : EMPTY) // let's concat that result with the final request

)


查看完整回答
反對 回復 2023-05-11
?
萬千封印

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

我相信處理這個問題的最好方法是使用高階可觀察量


考慮下面的代碼


useful$ = a.get('abc').pipe(

  mergeMap(abcdatas => 

    abcdata.exist ? forkJoin(abcdatas.map(abcdata => b.get('def'))) : of(undefined)

  ),

  map(defdatas => defdatas.flat()),

  mergeMap(({ length }) => length ? c.get('ghi') : of(undefined))

);


useful$.subscribe({

  next: () => { 

    // Completed...

  }

})

我們首先通過管道傳輸 的結果a.get('abc')并使用 mergeMap 來測試 if abcdata.exist。如果它確實退出,我們forkJoin(abcdatas.map(abcdata => b.get('def')))簡單地返回這將組合從 abcdatas 上的 map 函數生成的可觀察數組


map(defdatas => defdatas.flat()),將數組轉換為單個數組 注意:flat() 是在 ES2019 中引入的


接下來我們解構這個length屬性,如果它存在,我們返回我們最終的可觀察對象


查看完整回答
反對 回復 2023-05-11
  • 3 回答
  • 0 關注
  • 531 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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