Secuencia RxJS equvalente a promesa.entonces()?
Solía desarrollar mucho con promise y ahora me estoy mudando a RxJS. El documento de RxJS no proporciona un ejemplo muy claro sobre cómo pasar de la cadena de promesas a la secuencia del observador.
Por ejemplo, normalmente escribo cadena de promesas con varios pasos, como
// a function that returns a promise
getPromise()
.then(function(result) {
// do something
})
.then(function(result) {
// do something
})
.then(function(result) {
// do something
})
.catch(function(err) {
// handle error
});
¿Cómo debo reescribir esta cadena de promesas en el estilo RxJS?
2 answers
Para el flujo de datos (equivalente a then
):
Rx.Observable.fromPromise(...)
.flatMap(function(result) {
// do something
})
.flatMap(function(result) {
// do something
})
.subscribe(function onNext(result) {
// end of chain
}, function onError(error) {
// process the error
});
Una promesa se puede convertir en un observable con Rx.Observable.fromPromise
.
Algunos operadores prometedores tienen una traducción directa. Por ejemplo, RSVP.all
, o jQuery.when
puede sustituirse por Rx.Observable.forkJoin
.
Tenga en cuenta que tiene un montón de operadores que permite transformar datos de forma asíncrona, y realizar tareas que no puede o sería muy difícil de hacer con las promesas. Rxjs revela todos sus poderes con secuencias asíncronas de datos (secuencia, es decir, más de 1 valor asíncrono).
Para la gestión de errores, el tema es un poco más complejo.
- hay catch y finally operadores
-
retryWhen
también puede ayudar a repetir una secuencia en caso de error - también puede tratar los errores en el propio suscriptor con la función
onError
.
Para una semántica precisa, eche un vistazo más profundo a la documentación y los ejemplos que puede encontrar en la web, o pregunte preguntas específicas aquí.
Este sería definitivamente un buen punto de partida para profundizar en la gestión de errores con Rxjs: https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/error_handling.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-30 04:35:37
Una alternativa más moderna:
import {fromPromise} from 'rxjs/observable/fromPromise';
import {catchError, flatMap} from 'rxjs/operators';
fromPromise(...).pipe(
flatMap(result => {
// do something
}),
flatMap(result => {
// do something
}),
flatMap(result => {
// do something
}),
catchError(error => {
// handle error
})
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-04 16:33:03