Tengo el siguiente método que me gustaría actualizar a un estilo más reactivo. contiene lógica if/else. He leído que debería poder descomponerse en flujos, aplicar un filtro a cada flujo y volver a fusionar los flujos, pero no estoy seguro de cómo aplicar esto al siguiente ejemplo.
El método de muestra a continuación pasa un indicador de exclusión. el método llama primero a un servicio http para obtener una matriz. si el indicador de exclusión es verdadero, entonces debemos llamar a otro servicio http para obtener algunos datos de configuración que se necesitan para filtrar la matriz.
Gracias por tu ayuda.
method A(boolean excludeSomeCatagory ) : Observable<Species[]> { return Observable.create((observer) => { getSomeHttpData().subscribe((species: Species[]) => { if(!excludeSomeCatagory){ observer.next(species); observer.complete(); } else { getSomeConfigDataFromHttp().subscribe( (data) => { filteredArray: Species[] = applyFilter(data, species); observer.next(filteredArray); observer.complete(); }); } }); } }Algo como esto funcionaría:
public A(excludeSomeCategory: boolean): Observable<Species[]> { return getSomeHttpData().pipe( switchMap(species => { return !excludeSomeCategory ? of(species) : getSomeConfigDataFromHttp().pipe( map(data => applyFilter(data, species)) ) }) ); } La idea general es que comience su transmisión con un observable de su llamada http, luego canalice su emisión en la forma que necesita. Rara vez tendrá la necesidad de crear un observable usando Observable.create() porque rxjs ofrece muchos operadores estáticos que manejan muchos casos de uso comunes.
También desea evitar las suscripciones que no puede limpiar fácilmente ( suscripciones anidadas ).
Entonces, si simplemente getSomeHttpData(); esto sería de tipo Observable<Species[]> .
public A(): Observable<Species[]> { return getSomeHttpData(); } Obviamente, tiene algo más de lógica que desea hacer para realizar potencialmente una llamada api adicional, por lo que canalizamos la emisión ( Species[] ) a switchMap , que se suscribirá a un "observable interno" para usted y emitirá sus emisiones.
Entonces, dentro de switchMap , desea devolver un observable. En su caso, tiene una condición que simplemente puede devolver la emisión de recepción O realizará otra llamada http.
En el caso de que desee emitir la emisión anterior, usamos of para crear un valor observable a partir del valor simple.
En el otro caso, simplemente devolvemos la llamada a getSomeConfigDataFromHttp() , que a su vez devuelve un observable. Como desea transformar un poco los datos, usamos el map para manejar eso.
Simplemente devuelva el Observable directamente y use un SwitchMap .
method A(boolean excludeSomeCatagory ) : Observable<Species[]> { return getSomeHttpData().pipe( switchMap((species) => { if(!excludeSomeCatagory){ return of(species) } else { return getSomeConfigDataFromHttp().pipe( map(data => { return applyFilter(data, species) }) ) } }) ) }