Siempre encuentro concatMap anidado, las últimas solicitudes http se basan en los resultados anteriores. Vea el ejemplo a continuación, necesito obtener formConfig y luego usar la identificación de formConfig para obtener el registro de la aplicación, luego xxx. ¿Es más legible y mantenible convertir rxjs concatMap anidado en aysnc await ( Evitar el infierno de devolución de llamada)? ¿Pros y contras? ¿Cuál es más fácil de procesar el manejo de errores?
ConcatMap general anidado
ngOnInit(){ this.http.get(`/app-config/${this.appType}`) .pipe( concatMap(formConfig => { this.formConfig = formConfig; return this.http.get(`/appl/${this.formConfig.id}`); }), concatMap(applRec => { this.applRec = applRec; return this.http.get(`/xxx/${this.applRec.recNo}`) }) tap((val) => {this.xxx = val}) .... ).subscribe(); }Gire a asíncrono aguarde a Promise
constructor(){ this.init().then(); } async init() { this.formConfig = await this.http.get(`/app-config/${this.appType}`).toPromise(); this.applRec = await this.http.get(`/appl/${this.formConfig.id}`).toPromise(); this.xxx = await this.http.get(`/xxx/${this.applRec.recNo}`).toPromise(); }toPromise() está en desuso y se está eliminando, por lo que probablemente debería evitarlo. Más información sobre eso aquí: https://indepth.dev/posts/1287/rxjs-heads-up-topromise-is- being -deprecated#why-is-this-happening-to-me.
Si desea usar async / await /promises, puede usar firstValueFrom() . Las desventajas de usarlo se describen en los documentos aquí: https://rxjs.dev/api/index/function/firstValueFrom
ADVERTENCIA: solo use esto con observables que sepa que emitirán al menos un valor, O completo. Si la fuente observable no emite un valor o no se completa, terminará con una promesa colgada y, potencialmente, todo el estado de una función asíncrona colgando en la memoria. Para evitar esta situación, considere agregar algo como timeout, take, takeWhile o takeUntil, entre otros.
Entonces, la desventaja de las promesas es que necesita agregar un tiempo de espera o corre el riesgo de una pérdida de memoria. Sin embargo, no creo que tengas que preocuparte por esto al usar los observables del servicio HttpClient, nunca he visto uno que no emita un valor o se complete.
Dado que solo está buscando valores únicos y flujos no observables, no veo ningún inconveniente en el uso de promesas aquí. También puede simplemente etiquetar ngOnInit como async .
async ngOnInit() { this.formConfig = await firstValueFrom(this.http.get(`/app-config/${this.appType}`)); this.applRec = await firstValueFrom(this.http.get(`/appl/${this.formConfig.id}`)); this.xxx = await firstValueFrom(this.http.get(`/xxx/${this.applRec.recNo}`)); }