Estoy tratando de entender mis observables. Me encanta la forma en que los observables resuelven los problemas de desarrollo y legibilidad. Mientras leo, los beneficios son inmensos.
Los observables en HTTP y las colecciones parecen ser sencillos. ¿Cómo puedo convertir algo como esto en un patrón observable?
Esto es de mi componente de servicio, para proporcionar autenticación. Prefiero que esto funcione como otros servicios HTTP en Angular2, con soporte para manejadores de datos, errores y finalización.
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(function(firebaseUser) {
// do something to update your UI component
// pass user object to UI component
})
.catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
Cualquier ayuda aquí sería muy apreciada. La única solución alternativa que tuve fue crear EventEmitter
s. Pero supongo que es una forma terrible de hacer cosas en la sección de servicios
angular
firebase
rxjs
firebase-authentication
Krishnan Sriram
fuente
fuente
from
método devuelve observable pero está enviando promesa como valor a las suscripciones. :(operators
través de "intuición", me equivoqué.prueba esto:
Puede encontrar una referencia completa del operador fromPromise aquí .
fuente
import 'rxjs/add/observable/fromPromise';
import { Observable } from "rxjs/Observable";
:)1 Ejecución directa / conversión
Utilícelo
from
para convertir directamente una promesa creada previamente en una observable.observable$
será un observable atractivo que reproduce efectivamente el valor de las promesas para los suscriptores.El cuerpo de promesas se está ejecutando o ya se ha resuelto cuando se crea el observable. Si la promesa interna se ha resuelto, un nuevo suscriptor al observable obtendrá su valor de inmediato.
2 Ejecución diferida en cada suscripción
Úselo
defer
con una función de fábrica de promesas como entrada para diferir la creación y conversión de una promesa a una observable.observable$
Será un frío observable .La diferencia
from
es quedefer
espera a un suscriptor y solo entonces crea una nueva promesa llamando a la función de fábrica de promesa dada. Esto es útil cuando desea crear un observable pero no desea que la promesa interna se ejecute de inmediato. La promesa interna solo se ejecutará cuando alguien se suscriba a lo observable. Cada suscriptor también obtendrá su propio nuevo observable.3 Muchos operadores aceptan promesas directamente
La mayoría de los operadores RxJS que combinan (por ejemplo
merge
,concat
,forkJoin
,combineLatest
...) o transformar observables (por ejemploswitchMap
,mergeMap
,concatMap
,catchError
...) aceptar promesas directamente. Si está utilizando uno de ellos de todos modos, no tiene que usarlofrom
para envolver una promesa primero (pero para crear un observable en frío aún podría tener que usarlodefer
).Consulte la documentación o implementación para ver si el operador que está utilizando acepta
ObservableInput
oSubscribableOrPromise
.La diferencia entre
from
ydefer
en un ejemplo: https://stackblitz.com/edit/rxjs-6rb7vffuente
También puede usar un Asunto y activar su función next () desde la promesa. Ver muestra a continuación:
Agregue el código como a continuación (utilicé el servicio)
Crear usuario desde componente como a continuación
fuente
rxjs
.new Observable(observer => { ... observer.next() ... })
forma de implementarlo. Aunque sería una reimplementación de la función conocida existente, respondería directamente a la pregunta y no sería perjudicial para los lectores.También puede usar diferir . La principal diferencia es que la promesa no se va a resolver o rechazar con entusiasmo.
fuente
Puede agregar un contenedor alrededor de la funcionalidad de promesa para devolver un Observable al observador.
fuente