Uno de los principales problemas de los observables es el Callback Hell. La anidación de N cantidad de suscripciones, una dentro de la otra, vuelve tu código muy difícil de mantener y de leer.
Cómo solucionar el Infierno de Callbacks
Utilizando promesas, puedes resolver este problema fácilmente con async/await. Pero si hablamos de observables, nuestra mejor amiga, la librería RxJS, llega para aportar su solución.
Un ejemplo común de esta problemática en Angular es como la siguiente.
readAndUpdate():void{// Ejemplo de callback hellthis.apiService.getProduct(1).subscribe(res=>{this.apiService.updateProduct(1,{name:'Nuevo nombre del producto'}).subscribe(res2=>{// ...});});}
Donde se está realizando una petición para la lectura de un producto e inmediatamente se está actualizando el mismo. Generando un subscribe dentro de otro.
¿Cómo resolver este problema de Callback Hell?
Tal vez hasta dos subscribe es aceptable, pero no se recomienda continuar con esa estructura de código y es posible resolverlo de la siguiente manera.
Importando switchMap desde rxjs/operators, lo que hace esta función es recibir el dato que emite un observable, y utilizarlo como input para el segundo. De esta manera, el código queda más limpio y profesional.
Conoce más sobre RxJS
Otra alternativa que brinda RxJS es la posibilidad de manipular varios observables al mismo tiempo. Con las promesas, puedes hacer uso de Promise.all([]) para realizar N procesamientos asincrónicos en paralelo y obtener sus resultados.
De forma muy similar, en RxJS puedes hacer lo siguiente.
import{ zip }from'rxjs';readAndUpdate():void{// Agrupando observables en un mismo subscribezip(this.apiService.getProduct(1),this.apiService.updateProductPATCH(1,{name:'Nuevo nombre'})).subscribe(res=>{const get = res[0];const update = res[1];});}
Importando la función zip, puedes crear un array de observables y suscribirte a todos ellos al mismo tiempo. Diferenciando por el índice de cada uno el resultado de la operación que ejecutaron para obtenerlo.
En este ejemplo, el índice 0 posee el resultado de la lectura y el índice 1 el del update.
Sería un buen complemento en la escuela de Angular, un curso de Rxjs.
Si sería muy bueno
Cada vez lo veo mas necesario, RXJS es muy importante.
Un curso de Rxjs, plis. 0_o
Creo que es necesario
Mi reacción durante y despues de esta clase
+1
Muy buena la clase y la explicación del profesor, pero quiero aportar de que hay otros métodos que nos ayudan a realizar peticiones en paralelo en los observables, solo que hay que tener claro su uso y estos son: forkJoin, combineLatest y withLatestFrom.
Para que puedan observar las diferencias dejo por acá este link (https://www.digitalocean.com/community/tutorials/rxjs-operators-forkjoin-zip-combinelatest-withlatestfrom) donde se evidencian las diferencias de cada uno de ellos.
Ok, que bueno tu aporte y aclaración de ese detalle. Gracias por compartiro, Rober.
Para obtener los elementos del array (para el caso de Zip) cuando se conoce la posición y el tipo de dato, es más sencillo hacerlo así
const[read, update]= response;
Hola Miguel, lo que propones es colocar esto dentro el suscribe, o dentro del servicio?
No sería mejor utilizar MergeMap en lugar de SwitchMap para evitar que al iniciarce una nueva subscripción se ejecute el complete de la anterior sin haber terminado?
Hola, si depende del caso de uso para hacer esto hay tres pipes, MergeMap , SwitchMap y exhaustMap que depende del caso puede asegurar como se completan.
esa función de ZIP será de gran ayuda para optimizar el tiempo de respuesta de mi portal.
Excelente aporte
Rxjs es mi pastor
el profe Nicolas nombra NGRX en lugar RXJS, si alguien tiene la duda son cosas diferentes, NGRX es el "redux" de Angular que tambien funciona con observables (RXJS)
Es necesario tener presente que el uso de switchMapcancela el resultado del observable anterior, esto es, en caso de que se disparen dos peticiones dentro de un switchMap, este solo obtendrá el resultado del último,
Projects each source value to an Observable which is merged in the output Observable, emitting values only from the most recently projected Observable .>
Si lo que se quiere es enviar escuchar más de una observable a la vez y al mismo tiempo usar este resultado para encadenar un nuevo request a manera de callback se puede hacer uso de mergeMap, este permite unir observables sin priorizar uno sobre el otro.
Mi cerebro hizo Booom!!! jajaj
Zip , similar a PromiseAll()
Cada que avanzo en el curso me doy cuenta de lo increible y asombroso que es el Framework, tantas formas de solucionar problemas y todo tan claro con Nico, no me la creo jaja.
Hola, yo quiero saber como ejecutar un metodo solo cuando se complete una petición http
Hola Nicolas, que operador recomiendas para este clase de ejemplo el .zip o el .switchMap ? Teniendo en cuenta que el .zip hace un poco confusa la respuesta que se recibe al suscribirnos, ya que este retorna esa respuesta en un rray y pues el indice no es muy comprensible si otro desarrollador intenta leer el código?
Excelente clase.
Siii, Yo también creo que es muy importante un curso de programación reactiva con RxJS.
Sii, digo lo mismo. Yo también me uno a la petición!