reactiva programacion ejemplo javascript reactive-programming rxjs

javascript - programacion - rxjs observable no se completa cuando se produce un error



rxjs 6 (2)

Esto se debe a que un error significa que se completó, por lo que la devolución de llamada asociada a onCompleted nunca se llama. Puede revisar aquí el contrato de Rxjs para observables ( http://reactivex.io/documentation/contract.html ):

Un observable puede hacer cero o más notificaciones de OnNext, cada una representando un único elemento emitido, y luego puede seguir esas notificaciones de emisión ya sea por una notificación OnCompleted o OnError, pero no por ambas. Al emitir una notificación OnCompleted o OnError, no podrá emitir más notificaciones posteriormente.

Para la administración de errores, puede consultar: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/errors.md

Cuando creo un observable desde cero y tengo el error de observador, luego se completa, la parte realizada de la suscripción nunca se invoca.

var observer = Rx.Observable.create(function(observer){ observer.onError(new Error(''no!'')); observer.onCompleted(); }) observer.subscribe( function(x) { console.log(''succeeded with '' + x ) }, function(x) { console.log(''errored with '' + x ) }, function() { console.log(''completed'') } )

La salida es:

errored with Error: no!

Espero que sea:

errored with Error: no! completed

Si cambio el código para invocar onNext en lugar de onError, el observable se completa correctamente:

var observer = Rx.Observable.create(function(observer){ observer.onNext(''Hi!''); observer.onCompleted(); }) observer.subscribe( function(x) { console.log(''succeeded with '' + x ) }, function(x) { console.log(''errored with '' + x ) }, function() { console.log(''completed'') } )

Obtengo la salida esperada:

succeeded with Hi! completed

¿Por qué no se completa cuando ha ocurrido un error?


Mientras tenía la misma pregunta, me topé con este problema de github .

Aparentemente, el método del objeto Observable finally debe utilizarse en este caso.

Citando a Aleksandr-Leotech de ese hilo:

Completa y finalmente son cosas totalmente diferentes. Completo significa que el vapor observable se terminó con éxito. Porque puedes tener muchas llamadas de éxito. Finalmente significa que el vapor ha terminado, ya sea con éxito o no.

No es obvio con las solicitudes HTTP, pero imagina dos escenarios adicionales.

  1. Eventos del ratón. Recibirá un flujo interminable de devoluciones de llamada exitosas, pero nunca lo recibirá por fin o por completo, porque los eventos de los usuarios nunca se detendrán (a menos que active una excepción con el código defectuoso, obtendrá el error y finalmente).

  2. Trabajando con sockets web. Obtendrá múltiples devoluciones de llamada exitosas, pero en algún momento su comunicación con el back-end se detendrá y obtendrá ambos completos y finalmente, a menos que tenga algunos errores, que llamarán error y finalmente.

Por lo tanto, es posible que esté recibiendo varias llamadas o que no haya tenido éxito, cero o una llamada de error, cero o una completa y cero o una finalmente.