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
的功能?我的理解是,它将一系列承诺转化为一系列结果你似乎在使用它,就好像它是一个来自
操作符的一样。是的。它将数组展平为单个项,并发出每个项。