¿Cuál es la diferencia entre Promise
y Observable
en Angular?
Un ejemplo de cada uno sería útil para comprender ambos casos. ¿En qué escenario podemos usar cada caso?
¿Cuál es la diferencia entre Promise
y Observable
en Angular?
Un ejemplo de cada uno sería útil para comprender ambos casos. ¿En qué escenario podemos usar cada caso?
Respuestas:
Promesa
A
Promise
maneja un solo evento cuando una operación asincrónica se completa o falla.Nota: Existen
Promise
bibliotecas que admiten la cancelación, pero ES6Promise
no lo hace hasta ahora.Observable
Un
Observable
es como unStream
(en muchos idiomas) y permite pasar cero o más eventos donde se llama la devolución de llamada para cada evento.A menudo
Observable
se prefiere sobrePromise
porque proporciona las características dePromise
y más. ConObservable
eso no importa si desea manejar 0, 1 o múltiples eventos. Puede utilizar la misma API en cada caso.Observable
También tiene la ventajaPromise
de ser cancelable . Si el resultado de una solicitud HTTP a un servidor o alguna otra operación asíncrona costosa ya no es necesaria, laSubscription
opciónObservable
permite cancelar la suscripción, mientrasPromise
que eventualmente llamará a la devolución exitosa o fallida incluso cuando no necesite la notificación o el resultado que proporciona más.Observable proporciona operadores como
map
,forEach
,reduce
, ... similares a una matrizTambién hay operadores poderosos como
retry()
, oreplay()
, ... que a menudo son bastante útiles.fuente
Promise
, junto conasync
/await
hace que tu código vuelva a estar plano! En la mayoría de las situaciones, y en proyectos que no abordan la ciencia de cohetes, no hay necesidad de escribir esas horribles funciones anidadas con cadenas de métodos innecesariamente complicadas. Puede usarasync
/await
today con transpilers, comoTypeScript
, y escribir código plano legible por humanos sin ninguna de lasrxjs
repeticiones. Probablemente todavía necesitarárxjs
algunas veces en situaciones selectas, porque realmente tiene muchas cosas que ofrecer.Ambos
Promises
yObservables
nos proporcionan abstracciones que nos ayudan a lidiar con la naturaleza asincrónica de nuestras aplicaciones. La diferencia entre ellos fue señalada claramente por @ Günter y @Relu.Dado que un fragmento de código vale más que mil palabras, pase por el siguiente ejemplo para comprenderlo más fácilmente.
Angular usa Rx.js Observables en lugar de promesas para tratar con HTTP.
Suponga que está creando una función de búsqueda que debería mostrarle resultados instantáneamente a medida que escribe. Suena familiar, pero hay muchos desafíos que vienen con esa tarea.
HTTP
solicitudes. Básicamente, solo queremos presionarlo una vez que el usuario ha dejado de escribir en lugar de con cada pulsación de tecla.La demostración consistirá simplemente en dos archivos:
app.ts
ywikipedia-service.ts
. Sin embargo, en un escenario del mundo real, probablemente dividiríamos las cosas más arriba.A continuación se muestra una implementación basada en Promise que no maneja ninguno de los casos límite descritos.
wikipedia-service.ts
Estamos inyectando el
Jsonp
servicio para realizar unaGET
solicitud contra la API de Wikipedia con un término de búsqueda determinado. Tenga en cuenta que llamamostoPromise
para pasar de unaObservable<Response>
a unaPromise<Response>
. Finalmente, termina con aPromise<Array<string>>
como el tipo de retorno de nuestro método de búsqueda.app.ts
No es una gran sorpresa aquí tampoco. Inyectamos nuestra
WikipediaService
y exponemos su funcionalidad a través de un método de búsqueda a la plantilla. La plantilla simplemente se une al keyup y las llamadassearch(term.value)
.Desenvolvemos el resultado de la Promesa de que el método de búsqueda de WikipediaService regresa y lo exponemos como una simple Matriz de cadenas a la plantilla para que podamos
*ngFor
recorrerlo y crear una lista para nosotros.Vea el ejemplo de implementación basada en promesas en Plunker
Donde los observables realmente brillan
Cambiemos nuestro código para no dañar el punto final con cada pulsación de tecla, sino que solo enviaremos una solicitud cuando el usuario dejó de escribir durante 400 ms
Para revelar tales superpoderes, primero debemos obtener un
Observable<string>
que lleve el término de búsqueda que el usuario ingresa. En lugar de vincular manualmente al evento keyup, podemos aprovechar laformControl
directiva de Angular . Para usar esta directiva, primero necesitamos importarlaReactiveFormsModule
en nuestro módulo de aplicación.app.ts
Una vez importado, podemos usar formControl desde nuestra plantilla y configurarlo con el nombre "término".
En nuestro componente, creamos una instancia de
FormControl
from@angular/form
y la exponemos como un campo bajo el término de nombre en nuestro componente.Detrás de escena, el término expone automáticamente una
Observable<string>
propiedad como a lavalueChanges
que podemos suscribirnos. Ahora que tenemos unaObservable<string>
, superar la entrada del usuario es tan fácil como llamardebounceTime(400)
a nuestroObservable
. Esto devolverá un nuevoObservable<string>
que solo emitirá un nuevo valor cuando no haya habido nuevos valores durante 400 ms.Sería un desperdicio de recursos enviar otra solicitud de un término de búsqueda para el que nuestra aplicación ya muestra los resultados. Todo lo que tenemos que hacer para lograr el comportamiento deseado es llamar al
distinctUntilChanged
operador justo después de que llamamosdebounceTime(400)
Vea el ejemplo de implementación observable en Plunker
En cuanto a que estoy usando Http en Angular, estoy de acuerdo en que en los casos de uso normal no hay mucha diferencia cuando uso Observable sobre Promise. Ninguna de las ventajas es realmente relevante aquí en la práctica. Espero poder ver algún caso de uso avanzado en el futuro :)
fuente
Tanto Promises como Observables nos ayudarán a trabajar con las funcionalidades asincrónicas en JavaScript. Son muy similares en muchos casos, sin embargo, todavía hay algunas diferencias entre los dos, las promesas son valores que se resolverán de
asynchronous
manera similar a las llamadas http . Por otro lado, los observables tratan con una secuencia de eventos asincrónicos . Las principales diferencias entre ellos se enumeran a continuación:promesa:
observable:
Además, he creado la imagen gráfica para ti a continuación para mostrar las diferencias visualmente:
fuente
Promise
es la forma incorrecta de pensar en cómo promete. LaPromise
responsabilidad es solo manejar el éxito o el fracaso de una manera compatible asíncrona. Si desea cancelar una solicitud http, cancele la solicitud, no la promesa, y haga que el resultado de la cancelación cumpla o rechace la Promesa. jsfiddle.net/greggman/ea0yhd4pPromesas
Observables
Un reintento de operador se puede usar para reintentar cuando sea necesario, también si necesitamos volver a intentar el observable en función de algunas condiciones reintentarCuando se puede usar.
Nota : Una lista de operadores junto con sus diagramas interactivos está disponible aquí en RxMarbles.com
fuente
Hay una desventaja de los Observables que faltan en las respuestas. Las promesas permiten utilizar las funciones asincrónicas / en espera de ES7. Con ellos, puede escribir código asincrónico como si fuera una llamada de función sincrónica, por lo que ya no necesita devoluciones de llamada. La única posibilidad para que los Observables hagan esto es convertirlos en Promesas. Pero cuando los convierte en Promesas, solo puede volver a tener un valor de retorno:
Lectura adicional: ¿Cómo puedo `esperar 'en un Rx Observable?
fuente
Promises y Observables manejan la llamada asincrónica solamente.
Aquí están las diferencias entre ellos:
Observable
Promesa
Emite solo un valor a la vez
Llama a los servicios sin .then y .catch
No se puede cancelar
No proporciona ningún operador
fuente
Aunque esta respuesta llega tarde, he resumido las diferencias a continuación,
Observable:
function
que tomaan observer
y devuelve unfunction Observer: an object with next, error.
subscribe/unsubscribe
su flujo de datos, emitir el siguiente valor para el observador,notify
el observadorerrors
e informar al observador sobre elstream completion
function to handle next value
errores y final de la secuencia (eventos de interfaz de usuario, respuestas http, datos con sockets web).multiple values
el tiempocancel-able/retry-able
y es compatible con operadores comomap,filter,reduce
etc.Observable.create()
- devuelve Observable que puede invocar métodos en -Observer Observable.from()
- convierte una matriz o iterable en -Observable Observable.fromEvent()
- convierte un evento en Observable -Observable.fromPromise()
- convierte una Promesa en Observable -Observable.range()
- devuelve una secuencia de enteros en el rango especificadoPromesa :
Una promesa representa una tarea que terminará en el futuro;
Las promesas se hacen
resolved by a value
;Las promesas son rechazadas por excepciones;
No
cancellable
y vuelvea single value
Una promesa expone una función
(then)
-entonces devuelve un nuevo
promise
;-Permite
attachment
que se ejecute en función destate
;-
handlers
songuaranteed
para ejecutar enorder attached
;fuente
Acabo de tratar un problema en el que Promesas era la mejor solución, y lo comparto aquí para cualquiera que se encuentre con esta pregunta en caso de que sea útil (esta fue exactamente la respuesta que estaba buscando antes):
En un proyecto Angular2, tengo un servicio que toma algunos parámetros y devuelve una lista de valores para completar los menús desplegables en un formulario. Cuando se inicializa el componente de formulario, necesito llamar al mismo servicio varias veces con diferentes parámetros para definir varios menús desplegables diferentes, sin embargo, si simplemente coloco todas las variables para llamar al servicio, solo el último tiene éxito y el resto error fuera. El servicio que obtiene de la base de datos solo puede manejar una solicitud a la vez.
La única forma de completar con éxito todas las variables del menú desplegable era llamar al servicio de una manera que impidiera que se procesara una nueva solicitud hasta que finalizara la última solicitud, y el mecanismo Promesa / .then resolvió el problema muy bien.
Definí las funciones en el componente y luego llamé initializeDropDowns () en ngOnInit.
La función fetchValueList devuelve una Promesa, por lo que la primera llamada pasa el primer listCode y cuando la Promesa se resuelve, el valor devuelto está en la variable de datos en el bloque .then donde podemos asignarlo a la variable this.firstValList. Como la función ha devuelto datos, sabemos que el servicio ha finalizado y es seguro volver a llamar con el segundo listCode, el valor de retorno está en la variable de datos en el siguiente bloque .then y lo asignamos a la variable this.secondValList.
Podemos encadenar esto tantas veces como sea necesario para completar todas las variables, y en el último bloque de código simplemente omitimos la declaración de retorno y el bloque termina.
Este es un caso de uso muy específico en el que tenemos un único servicio que debe llamarse varias veces a medida que el componente se inicializa, y donde el servicio tiene que completar su recuperación y devolver un valor antes de que pueda llamarse nuevamente, pero en este caso, El método Promesa / .then fue ideal.
fuente
scan()
para construir una secuencia de observables secuenciales. Sin embargo, su enfoque es quizás más explícito y más fácil de entender.Creo que todas las otras respuestas deberían aclarar tus dudas. Sin embargo, solo quería agregar que los observables se basan en la programación funcional, y encuentro muy útiles las funciones que vienen con él como map, flatmap, reduce, zip. La consistencia que logra la web, especialmente cuando depende de las solicitudes de API, es una mejora brutal.
Recomiendo esta documentación , ya que es la documentación oficial de reactiveX y creo que es la más clara que existe.
Si desea entrar en observables, sugeriría esta publicación de 3 partes: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
Aunque está destinado a RxJava, los conceptos son los mismos y está muy bien explicado. En la documentación reactiveX, tiene las equivalencias para cada función. Debes buscar RxJS.
fuente
Promesa:
Observable:
Puede usar promesas en lugar de observables cuando llame a HTTP en Angular si lo desea.
fuente
Visión general:
Siempre puede usar un observable para tratar el comportamiento asincrónico, ya que un observable tiene todas las funciones que ofrece una promesa (+ extra). Sin embargo, a veces esta funcionalidad adicional que ofrece Observables no es necesaria. Entonces sería una sobrecarga adicional importar una biblioteca para que pueda usarlos.
Cuándo usar Promesas:
Use promesas cuando tenga una sola operación asincrónica de la cual desea procesar el resultado. Por ejemplo:
Entonces, una promesa ejecuta un código donde se resuelve o rechaza. Si bien la resolución o rechazar que se llama la promesa pasa de un estado pendiente ya sea a un resueltos o rechazada estado. Cuando se resuelve el estado de la promesa
then()
, se llama al método. Cuando se rechaza el estado de promesa,catch()
se llama al método.Cuándo usar Observables:
Use Observables cuando haya una secuencia (de datos) a lo largo del tiempo que necesite manejar. Una secuencia es una secuencia de elementos de datos que están disponibles a lo largo del tiempo . Ejemplos de transmisiones son:
En el Observable en sí se especifica cuándo ocurrió el siguiente evento , cuándo ocurre un error o cuando se completa el Observable . Entonces podemos suscribirnos a este observable, que lo activa y en esta suscripción, podemos pasar 3 devoluciones de llamada (no siempre tiene que pasar todas). Se debe ejecutar una devolución de llamada para el éxito, una devolución de llamada para error y una devolución de llamada para completar. Por ejemplo:
Al crear un observable, requiere una función de devolución de llamada que proporciona un observador como argumento. En este observador, a continuación, puede llamar
onNext
,onCompleted
,onError
. Luego, cuando el Observable esté suscrito, llamará a las devoluciones de llamada correspondientes que se pasaron a la suscripción.fuente
Promesa: proporcione un único valor futuro. No perezoso . No cancelable Rechazará o resolverá.
Observable: proporciona un valor futuro múltiple. Perezoso Cancelable Proporciona otros métodos de mapa en vivo, filtro, reducción.
fuente
Promesa vs similitud observable primero
Ejemplo observable ahora. Aquí también pasamos una función a observable, un observador para manejar la tarea asincrónica. A diferencia de la resolución en la promesa, tiene el siguiente método y se suscribe en ese momento.
Entonces ambos manejan tareas asíncronas. Ahora veamos la diferencia.
Promesa vs diferencia observable
Promesa
Observable
fuente
Below are some important differences in promises & Observables.
fuente
Una promesa emite un solo evento cuando una actividad asíncrona finaliza o falla.
Un Observable es como un Stream (en muchos idiomas) y permite pasar al menos cero o más eventos donde se requiere la devolución de llamada para cada evento.
Frecuentemente se prefiere Observable sobre Promise ya que brinda los aspectos más destacados de Promise y más. Con Observable no importa si necesita manejar 0, 1 o varios eventos. Puede usar la API similar para cada caso.
Promesa: la promesa emite un valor único
Por ejemplo:
Observable: Emite valores múltiples durante un período de tiempo.
Por ejemplo:
Podemos pensar en un observable como un flujo que emite múltiples valores durante un período de tiempo y se llama a la misma función de devolución de llamada para cada elemento emitido, por lo que con un observable podemos usar la misma API para manejar datos asincrónicos. si esos datos se transmiten como un valor único o como valores múltiples durante un período de tiempo.
Promesa:
Observable:
Promesas angulares vs observables
fuente
Promise emite un único valor, mientras que Observable emite varios valores. Entonces, mientras maneja una solicitud HTTP, Promise puede administrar una sola respuesta para la misma solicitud, pero qué pasa si hay múltiples respuestas a la misma solicitud, entonces tenemos que usar Observable. Sí, Observable puede manejar múltiples respuestas para la misma solicitud.
Promesa
Salida
Observable
Salida
fuente
Promesa
Observable
Para una mejor comprensión, consulte https://stackblitz.com/edit/observable-vs-promises
fuente
Veo a muchas personas usando el argumento de que Observable es "cancelable", pero es bastante trivial hacer que Promise sea "cancelable"
fuente
Respuesta corta :
Observable es mejor , tiene todas las características de Promises más características adicionales.
Respuesta larga:
Promesas:
Observable:
fuente
Si bien la respuesta aceptada es buena en general, no creo que haga hincapié en que cuando se trata de componentes angulares casi siempre desea usar un observable porque admite la cancelación. Las promesas no se pueden cancelar y se resolverán incluso si se destruye su componente. Angular tiende a ser indulgente hasta que no lo es.
Por ejemplo, cualquier detección de cambio manual en un componente destruido causará una excepción:
Si su componente se destruye antes de que se resuelva la promesa, recibirá un
attempt to use destroyed view
error cuando se resuelva la promesa.Alternativamente, si utiliza observables con el patrón takeUntil , tan pronto como se destruya su componente, se cancelará la suscripción.
Este es un ejemplo un poco artificial, pero la ejecución de código para un componente que se destruye probablemente conducirá a errores. A menos que realmente quiera hacer eso por alguna razón: p
fuente
Algo con lo que me encontré que no era evidente en una primera lectura del tutorial y los documentos fue la idea de multidifusión.
Asegúrese de saber que, de forma predeterminada, las suscripciones múltiples desencadenarán múltiples ejecuciones en un Observable. Múltiples suscripciones a una sola llamada HTTP Observable activará múltiples llamadas HTTP idénticas a menos que usted
.share()
(habilite la multidifusión).Una promesa lo obliga a lidiar con una cosa a la vez, desenvolver sus datos, manejar excepciones, tiene soporte de idioma para cosas interesantes como async / wait y, de lo contrario, es bastante básico.
Un Observable tiene muchas campanas y silbatos, pero necesita comprender el poder con el que está trabajando o puede ser mal utilizado.
fuente
Promesa:
Un controlador de eventos asíncrono: el objeto Promise representa la finalización (o falla) eventual de una operación asincrónica y su valor resultante.
Sintaxis: nueva promesa (ejecutor);
P.ej:
Acerca de Promise: tiene una canalización, por lo que devolverá valores solo una vez cuando se llame. es un controlador unidireccional, por lo que una vez llamado, es posible que no pueda cancelar. sintaxis útil con la que puedes jugar, cuando () y luego ()
Observables:
Los observables son colecciones perezosas de múltiples valores a lo largo del tiempo. Es realmente un gran enfoque para las operaciones asíncronas. se puede hacer con rxjs que tiene soporte multiplataforma que se puede usar con angular / reaccionar, etc.
actúa como un transatlántico. puede ser de múltiples tuberías. así que una vez definido, puede suscribirse para obtener resultados de retorno en muchos lugares.
Sintaxis:
import * as Rx from "@reactivex/rxjs";
para iniciar:etc.
Suscribirse:
RxLogger.getInstance();
P.ej:
Dado que admite múltiples canalizaciones, puede suscribirse a resultados en una ubicación diferente, tiene muchas posibilidades que las promesas.
Uso: tiene más posibilidades como
map, filter, pipe, map, concatMap etc
fuente
La diferencia básica entre observables y promesas son:
fuente
Los observables a menudo se comparan con las promesas. Aquí hay algunas diferencias clave:
Los observables son declarativos; El cálculo no comienza hasta la suscripción. Las promesas se ejecutan inmediatamente en la creación. Esto hace que los observables sean útiles para definir recetas que se pueden ejecutar siempre que necesite el resultado.
Los observables proporcionan muchos valores. Las promesas proporcionan una. Esto hace que los observables sean útiles para obtener múltiples valores a lo largo del tiempo.
Los observables diferencian entre encadenamiento y suscripción. Las promesas solo tienen cláusulas .then (). Esto hace que los observables sean útiles para crear recetas de transformación complejas para ser utilizadas por otras partes del sistema, sin que el trabajo se ejecute.
Observables subscribe () es responsable de manejar los errores. Las promesas empujan los errores a las promesas del niño. Esto hace que los observables sean útiles para el manejo centralizado y predecible de errores.
Esa es la diferencia más simple que puede encontrar en los documentos ANGULAR.IO. la respuesta de descanso es dada por la mayoría es correcta en su propio lugar
fuente
Las promesas se centran solo en valores individuales o resuelve, los observables son un flujo de datos.
Los observables pueden cancelarse pero las promesas no pueden cancelarse.
El menos conocido, al menos para mí es
fuente
flujo de valores (de 0 a múltiples valores),
fuente
Observables and Promises nos están ayudando a trabajar con las funcionalidades asincrónicas en JavaScript / mecanografiado. Son muy similares en muchos casos, sin embargo, todavía hay algunas diferencias entre ellos.
fuente
Ya hay muchas respuestas sobre este tema, así que no agregaría una redundante.
Pero para alguien que acaba de comenzar a aprender Observable / Angular y se pregunta cuál usar en comparación con Promise , le recomendaría que mantenga todo Observable y convierta todas las Promesas existentes en su proyecto en Observable.
Simplemente porque el marco angular en sí y su comunidad están utilizando Observable. Por lo tanto, sería beneficioso integrar servicios de marco o módulos de terceros y encadenar todo.
Si bien aprecio todos los votos negativos, pero insisto en mi opinión anterior, a menos que alguien haga un comentario adecuado para enumerar algunos escenarios que aún podrían ser útiles en su proyecto Angular para usar Promesas sobre Observables.
Por supuesto, ninguna opinión es 100% correcta en todos los casos, pero al menos creo que el 98% del tiempo para proyectos comerciales regulares implementados en un marco angular, Observable es el camino correcto.
Incluso si no te gusta en el punto de partida de tu simple proyecto de pasatiempo, pronto te darás cuenta de que casi todos los componentes con los que interactúas en Angular, y la mayoría del marco de terceros amigable de Angular está usando Observables, y luego podrás terminó convirtiendo constantemente su Promesa en Observable para comunicarse con ellos.
Esos componentes incluyen, entre otros: HttpClient, Form Builder, Módulos / cuadros de diálogo de material angular, Ngrx store / effects y ngx-bootstrap.
De hecho, la única promesa del ecosistema angular con la que traté en los últimos 2 años es
APP_INITIALIZER
.fuente