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.