Tengo un escenario en el que necesito hacer una llamada API secuencial usando RxJs
en Angular
, lo cual hice pero me encuentro con este error nulo. Para llamar a la segunda API, recibiré una id
de la primera API, que puede ser null
o undefined
. Entonces, lo que quería Si si la identificación no está disponible, regresaré of(null)
, de lo contrario, devolveré la respuesta. Pero hay algún error mecanografiado. Lo siguiente es lo que he hecho hasta ahora.
of(personId).pipe( take(1), switchMap((personId: string) => { return this.personService.getById(personId).pipe( concatMap((person: Person) => { const classId = person?.class?.id || null; let class$ = of(null); if (classId) { class$ = this.classService.getById(classId); // Will return Observable<Class> } return combineLatest([of(person), class$]) }) ) }), tap(([person, class]) => { console.log('Person: ', person); console.log('Clas: ', class); }) ).subscribe()
class$ = this.classService.getById(classId);
En esta línea estoy frente al 'TS2322: Observable is not asignable to Observable'
¿Alguna sugerencia de cómo resuelvo esto? También se puede mejorar este código?
simplemente puede reemplazar la lógica condicional con esta línea
let class$= classId?this.classService.getById(classId):of(null)
El observable que devuelve this.classService.getById
es diferente al que devuelve of(null)
, por lo tanto, no puede reasignar la variable class$
con él.
Sin embargo, su problema se puede superar fácilmente simplemente usando un operador ternario para definir class$
de la siguiente manera:
const class$ = person?.class?.id ? this.classService.getById(classId) : of(null);
En primer lugar, esto of(personId)
parece extraño.
Por que no:
this.personService.getById(personId).pipe( concatMap((person: Person) => { const class$ = person?.class?.id ? this.classService.getById(person?.class?.id) : of(null); return combineLatest([of(person), class$]); }) ).subscribe(/*...*/);
El error TS2322: Observable is not assignable to Observable
, creo que se describe a sí mismo.