Javascript 将rjxs映射和展平/缩小转换为flatMap

Javascript 将rjxs映射和展平/缩小转换为flatMap,javascript,angular,typescript,rxjs,rxjs5,Javascript,Angular,Typescript,Rxjs,Rxjs5,我相信下面的代码可以使用flatMap进行重构,但我似乎无法让它按预期工作 我理解flatMap本质上是映射然后展平,这对我来说非常适合,因为我使用forkJoin,所以从getAutocompleteSuggestions返回一系列响应 我想要订阅时的单个结果数组,这是下面的代码生成的结果,但是将顶级映射更改为flatMap会将多个单个对象发送到订阅。如何使用flatMap更好地编写此代码 const $resultsObservable: Observable<any> =

我相信下面的代码可以使用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和数组原型方法flatMap之间可能有点混淆。请注意,RxJS flatMap的目的不是展平作为流主体的阵列,而是将观察数据流展平为单个观察数据。请参阅以下帖子:

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

如果希望代码更简洁,可以使用myArray.flatMap方法。以下是使用阵列平面图方法对您的问题的潜在答案:

const$resultsObservable:Observable=Observable.ofquery .switchMapq=>this.getAutocompleteSuggestionsq //因为响应是一个数组的数组,所以这里使用数组的Flatmap。 //RxJS flatMap不处理展平阵列 .mapres=>res.flatMapresp=>{ 常量内容=相应内容; content.mapreult=>this.someMethodresult; 返回内容; }; GetAutoCompleteSuggestQuery:string:Observable{ const subs$=[]; //…向$subs添加一些可观察对象 返回可观察的。forkJoin…subs$;
}其中的content.map…行存在错误或不清楚。由于不使用其结果,因此会执行someMethod,但它不是可观察链中返回的结果。如果这是有意的,您应该在可观察级别上运行它,并在数组级别上使用forEach。两个级别上的映射都是为了映射数据,而不是执行副作用。resp.content是一个数组,因此我转换它然后返回它,基本上丢弃resp中的所有其他内容,并且转换我需要的数据不会就地修改数组。当然,但是传入的变量结果是通过引用传递的,在传递引用数组中修改并保持修改状态的对象,则应使用forEach。map不适用于副作用。代码可能会工作,它只是设计得很糟糕,并且打破了最小意外的原则。在这一行:.mapres=>res.flatMapresp=>{res是一个数组,所以我得到了一个错误,res.flatMap不是一个functionpologies,flatMap方法不是javascript规范的一部分-它只是被提出的,而且是。看起来您可能必须使用map和自己的展平方法的组合。或者您可以尝试使用类似或的库。