将 rjxs map 和 flatten/reduce 转换为 flatMap



我相信可以使用flatMap重构以下代码,但我似乎无法使其按预期工作。

我理解flatMap本质上是映射然后展平化,这对我来说是完美的,因为我正在使用forkJoin,所以从getAutocompleteAdvice((中获取一系列响应。

我想要订阅时的结果数组(这就是下面的代码产生的(,但是将顶级映射更改为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 流扁平化为单个可观察量。请参阅此帖子:

为什么我们需要使用flatMap?

。基本上,如果 Observable 表示一个推送类型 T 值的可观察对象,则 flatMap 将类型为 T' -> Observable 的函数作为其参数,并返回 Observable。map 采用 T' -> T 类型的函数并返回可观察。

如果希望代码更简洁一些,可以使用 myArray.flatMap 方法。以下是使用数组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$);
}

最新更新