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?

Author: Community, 2015-12-30

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

 60
Author: user3743222,
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
   })
)
 6
Author: mik01aj,
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