簡體   English   中英

轉換rjxs映射並將flatten / reduce轉換為flatMap

[英]convert rjxs map and flatten/reduce to flatMap

我相信以下代碼可以使用flatMap進行重構,但是我似乎無法使其按需工作。

我了解flatMap本質上是映射,然后進行展平,這對我來說是完美的,因為我正在使用forkJoin,因此可以從getAutocompleteSuggestions()返回一系列響應。

我希望在訂閱時得到一個結果數組(這是下面的代碼生成的結果),但是將頂級映射更改為flatMap會將多個單個對象發送給訂閱。 如何使用flatMap()更好地編寫此代碼?

   const $resultsObservable: Observable<any> = Observable.of(query)
          .switchMap(q => this.getAutocompleteSuggestions(q))
          //tried changing the below to flatMap()
          .map(res => { 
            return res.map(resp => {
              const content = resp.content;
              content.map(result => this.someMethod(result));
              return content;
            })
            .reduce((flatArr, subArray) => flatArr.concat(subArray), []);
          });



  getAutocompleteSuggestions(query: string): Observable<any> {
    const subs$ = [];
    //... add some observables to $subs
    return Observable.forkJoin(...subs$);
  }

看起來RxJS flatMap與Array原型方法flatMap之間可能有些混亂。 請注意,RxJS flatMap的目的不是將流的主題數組展平,而是將Obervable的流展平為單個Observable。 看到這樣的帖子:

為什么我們需要使用flatMap?

...基本上,如果Observable表示一個推入類型T的值的可觀察對象,則flatMap將類型T'-> Observable的函數作為其參數,並返回Observable。 map采用類型T'-> T的函數並返回Observable。

如果希望代碼更myArray.flatMap一點,可以使用myArray.flatMap方法。 這是使用Array flatMap方法對您的問題的可能答案:

 const $resultsObservable: Observable<any> = Observable.of(query) .switchMap(q => this.getAutocompleteSuggestions(q)) // Flatmap on the array here because response is an array of arrays. // The RxJS flatMap does not deal with flattening arrays .map(res => res.flatMap(resp => { const content = resp.content; content.map(result => this.someMethod(result)); return content; })); getAutocompleteSuggestions(query: string): Observable < any > { const subs$ = []; //... add some observables to $subs return Observable.forkJoin(...subs$); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM