JavaScript posee dos maneras de manejar la asincronicidad, a través de: Observables y Promesas, que comparten el mismo objetivo, pero con características y comportamientos diferentes.
¿Qué es la asincronicidad en JavaScript?
La asincronicidad se refiere a cuando Javascript utiliza procesos asíncronos para realizar muchas tareas a la vez, tareas que pueden tomar determinado tiempo o nunca finalizar. Es decir, este lenguaje de programación es un monohilo y esto significa que solo puede hacer una cosa a la vez y la ejecución de un proceso demorará a los que vengan posteriormente hasta que este termine.
Es así como la lectura de archivos o las peticiones HTTP son procesos asíncronos y se requiere de un método para manipular este tipo de procesos como los observables y promesas.
¿Qué son los observables?
Gran parte del ecosistema Angular está basado en observables y la librería RxJS es tu mejor aliado a la hora de manipularlos. El patrón de diseño "observador" centraliza la tarea de informar un cambio de estado de un determinado dato o la finalización de un proceso, notificando a múltiples interesados cuando esto sucede sin necesidad de que tengan que consultar cambios activamente.
Características de los Observables en Javascript
Emiten múltiples datos
Permiten escuchar cualquier tipo de proceso, (peticiones a una API, lectura de archivos, etc.)
Notifican a múltiples interesados
Pueden cancelarse
Manipulan otros datos (transformar, filtrar, etc.) con RxJS.
Son propensos al callback hell
Ejemplos con Observables
import{Observable}from'rxjs';constgetAnObservable$=()=>{returnnewObservable(observer=>{ observer.next('Valor 1'); observer.next('Valor 2'); observer.next('Valor 3');});};(()=>{ getAnObservable$
.pipe(// Manipulación de resultados con RxJS).subscribe(res=>{console.log(res);});})
¿Qué son las promesas?
Las promesas son un método algo más sencillo y directo para manipular procesos asincrónicos en Javascript. Además,
estos objetos tienen dos posibles estados:
Resuelto
Rechazado
Dependiendo si el proceso asincrónico se ejecutó correctamente hubo algún error.
Desde el año 2017 se especificó en el estandar de EcmaScript la posibilidad de manipular promesas de una manera mucho más fácil con async/await. Async para especificar que una función es asíncrona y Await para esperar por el resultado sin bloquear el hilo de ejecución.
Características de las Promesas
Ofrecen mayor simplicidad
Emiten un único valor
Evitan el callback hell
No se puede cancelar
Proveen una robusta API nativa de Javascript disponible desde ES 2017
Constituyen librerías populares como AXIOS o Fetch
Ejemplos con Promesas
// Promesas con .then() y .catch()const p =newPromise((resolve, reject)=>{setTimeout(function(){resolve("¡Hola Promesa!");},1000);});p.then((result: string)=>{console.log(result);// ¡Hola Promesa!}).catch(err=>{console.log(err);// En caso de error});// Promesas con async/await(async()=>{const p =awaitnewPromise((resolve, reject)=>{setTimeout(function(){resolve("¡Hola Promesa!");},1000);}).catch(err=>{console.log(err);// En caso de error});;console.log(p);// ¡Hola Promesa!});
Observable a Promesa
Una característica más de RxJS es la posibilidad de convertir fácilmente un Observable a Promesa:
import{of, firstValueFrom, lastValueFrom }from'rxjs';observableToPromise():Promise<string>{returnlastValueFrom(of('¡Soy una promesa!'));}
La función of devuelve en forma de observable lo que sea que le coloques dentro. La función firstValueFrom o lastValueFrom devuelve el primer (o último) valor que el observable emita en forma de promesa.
Promesa a Observable
De manera muy similar, puedes convertir una Promesa en un Observable:
import{from}from'rxjs';PromiseToObservable():Promise<Observable<any>>{returnfrom(newPromise((resolve, reject)=>{console.log('¡Soy un observable!')}));}
La función from de RxJS convertirá una promesa en observable para que puedas manipular y suscribirte a la emisión de sus datos.
Conclusión
En ocasiones te sentirás mejor trabajando de las dos maneras, tanto con el observable como con la promesa. Lo importante es comprender cómo funcionan ambos objetos, sus características, diferencias y decidir cuál aplicar en tus proyectos de programación.
Estuvo buena la clase, pero sinceramente por favor considerar hacer un curso de RXJS y sus operadores (al menos los mas utilizados), no es algo que se pueda ver y practicar con 1 o 2 clases, debiese ser un curso dentro del roadmap de la escuela. Recordemos que tener conocimientos sobre los operadores RXJS nos da un poder bastante grande en el desarrollo con Angular
Me asombra el conocimiento que tiene Nicolás, me gustaría saber un poco de su historia de como aprendió y aprende tan minuciosamente todo este tema, pues sería un ejemplo a seguir. Gracias por la explicación.
Soy un observable de este curso, ja ja ja.
Deberia existir un curso de rxjs orientado a angular
Totalmente! Eso es otro mundo, yo hice un curso dedicado a ello. Pero sin duda nos falta ese curso de RXJS en el roadmap de la Escuela
Magistral clase!!
Muchas gracias Nicolas por esta explicación 👍👍.
Observables:
Omitir / responder varias respuestas
Transmisión de muchos datos
Permite hacer transformaciones de datos y cancelar la subscripción
Permite transformar la respuesta (pipes)
Es posible escuchar constantemente : eventos / responsive / fetchs
Promesa :
Retorna una única respuesta
Solo se ejecuta una vez
Simplicidad
#HaganCursoDeRXJS
Estaba con muchas dudas acerca de qué tan parecida era una promesa y un observable, y esta clase me ha ayudado un montón.
recomiendo mucho esta clase de otro curso aqui en platzi para entender mejor los observables y su patron de diseño
Excelente curso @nicobytes, sobretodo por que te motiva entender lo que explican en el video mediante "el apartado recursos" donde el profe aporta información de mucho valor para repasar la lección.
Aquí hay otro aporte muy bueno acerca de Promesas y Observables, con Alan Buscaglia | Gentleman Programming
Entrevista Técnica de Angular - Promesas VS Observables
Sin dudas tomare el curso de Programación Reactiva con RxJS, lo dejare sin duda en mi lista de cursos que debo tomar despues de terminar la ruta de Angular o antes
Como se llama la extensión que usa el profesor para correr el javascript desde la terminal?
Code Runner
Guía instalación
Tengo en este momento la inquietud si RXJS es programación reactiva en Angular.
Siendo así, como manejar nueva información que viene desde base de datos para actualizar la pantalla actual que se tenga.
Saludos y Exitos.
Justo RxJS te permite trabajar con cosas asíncronas por medio de observables.
No necesariamente ocupas RxJS para reflejar nueva data que viene de una petición que realizaste a tu API.
Angular detecta cuando hay un cambio, en este caso, algo de info que solicitaste y al llegar actualizaste la variable o arreglo de datos que estás mostrando en pantalla.
Al saber Angular que algo cambió, comienza a buscar entre todo el árbol de componentes hasta encontrar qué cambió. Es entonces cuando renderiza ese componente o pedazo de info nueva.
aquí quedo resuelta mi pregunta del porque no cancelábamos las suscripciones para el caso de las peticiones con HttpClient
Mis notas de esta clase
En un Observable se emite un stream de respuestas que se pueden obtener suscribiéndose al Observable. Por convención al crear un observable se pone $ al final del nombre. Angular usa Observables es muchos sitios, como en formularios reactivos, escuchar eventos dinámicos, hacer peticiones HTTP, etc.
Permite hacer transformaciones de los datos que se están recibiendo usando pipes():
const{ filter }=require('rxjs/operators');...
getAnObservable$
.pipe(// Transformación de datosfilter(value => value !===null)).subscribe(res =>{console.log(res);});
Nota: cuando Angular hace una petición HTTP, al terminar la petición destruye el observable.
Excelente clase, muy importante la comparación Observable vs. Promise
Para convertir un Observable a Promise se usa:
// Angular mayor a 13.* operador lastValueOflastValueOf( observable )// Angular menor a 13.*observable.asPromise()
Para convertir un Promise a Observable se usa:
// Angular mayor a 13.* operador ofof(promise)
en Node 18 ya no ha necesidad del async .
La diferencia entre Promesa y Obsevable:
++Promesa++: Una sola respuesta, no es cancelable.
++Observable++: un Stream de de respuestas y es cancelable.
Algo que me causa muchas dudas es el tema de como puedo escuchar la información cuando cambia directamente en la base de datos, como la petición a la api sobre la que hubo dicho cambio para que lo tome o vuelva a hacer la petición o como podría implementar un chat entre el vendedor y el cliente(cuando veía java usaba web sockets pero no se si aun se use y no he visto mención de eso aquí :c)
No soy ningún especialista pero yo creo que los sockets se siguen usando ya que que son canales bidireccionales.