Javascript 将订阅重构为可观察的

Javascript 将订阅重构为可观察的,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我使用一个方法query\u character返回一个承诺,该承诺发出多个http请求。然后我将该值发送给主题this.search\u result$。这正如预期的那样工作,但是我想摆脱那些丑陋的嵌入式订阅,而是从订阅返回一个结果数组 private query_character(query): void { this.api.fetch_character_query(query) .subscribe( query_responses => { que

我使用一个方法
query\u character
返回一个承诺,该承诺发出多个http请求。然后我将该值发送给主题
this.search\u result$
。这正如预期的那样工作,但是我想摆脱那些丑陋的嵌入式订阅,而是从订阅返回一个结果数组

private query_character(query): void {
    this.api.fetch_character_query(query)
    .subscribe( query_responses => {
      query_responses.subscribe( characters => {
        this.search_result$.next( characters )
      });
    })
  }
调用的
fetch\u character\u查询

  public fetch_character_query( query ): any {
    return this.http.get<any>(`some-url`)
    .pipe( map( character_ids => {
      // NOTE:  fetch_character_info returns an Observable
      return character_ids.character.map( character_id => this.fetch_character_info(character_id) ); 
    }))
    .pipe( map( characters => forkJoin( characters ) ) )
  }
public fetch\u character\u查询(查询):任意{
返回this.http.get(`someURL`)
.pipe(映射(字符标识=>{
//注意:fetch\u character\u info返回一个可观察的
返回character\u id.character.map(character\u id=>this.fetch\u character\u info(character\u id));
}))
.pipe(映射(字符=>forkJoin(字符)))
}
我如何返回一个带有结果的数组(从
this.fetch\u character\u info中解析的可观测值)而不是一个可观测值数组?

公共fetch\u character\u查询(查询):任何{
public fetch_character_query( query ): any {
    return this.http.get<any>(`some-url`)
    .pipe( 
       mergeMap(character_ids => character_ids), //will emit each character id
       mergeMap(id => this.fetch_character_info(character_id).pipe(
           map(res => change into shape you need here),
           catchError(err => handle it)
       ),
       toArray(),
       catchError(err => handle it)
     )

返回此.http.get

非常好。唯一的建议是使用switchMap over mergeMap,以便在出现新请求时取消现有请求。否则,我会看到一些有趣的竞争条件。您能否详细说明第一个
mergeMap
的功能?我的理解是,它将一系列承诺转化为一系列结果你似乎在使用它,就好像它是一个来自
操作符的
一样。是的。它将数组展平为单个项,并发出每个项。