Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

306
Views
No cerrar Observable después de un error

Sé que esta pregunta puede parecer bastante simple, pero los recursos en la web sobre Observables y el manejo de errores no son tan buenos (o tal vez solo soy malo buscando).

Tengo una solicitud http que devuelve un Observable of Response , estas Respuestas pueden contener datos o un mensaje de error. Si contiene datos, quiero extraerlos y analizarlos, si contiene el mensaje de error, quiero omitir todos los demás operadores (sobre el análisis) y ejecutar la función de error en el suscriptor.

Puedo hacer todas estas cosas lanzando un error:

 http.get(...). ... .do(res=>{ if(res.error) throw new Error(res.error.message); return res; })

y funciona, se salta todos los operadores y ejecuta la función de error. El problema es que, luego del error, el Suscriptor se detiene y ya no acepta datos.

Si analizo el suscriptor después del error, noto que las propiedades cerradas y está detenida están configuradas como verdaderas . Quiero evitar esto, quiero mantener el Observable activo también después de los errores. ¿Cómo puedo hacerlo?

Gracias

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Como se mencionó en respuestas anteriores, este es el comportamiento estándar, garantizado por contrato de observables Rxjs . Si quieres escapar de los contratos, puedes materialize tu fuente, en cuyo caso, en lugar de tratar con mensajes transmitidos a través de tu observable, tratarás con meta-mensajes (llamados notificaciones, de los tres tipos que esperas, a next , error , complete ). No hay ningún contrato sobre los metamensajes, lo que impone la carga sobre usted para crear su error y completar los mensajes a mano, o usar la dematerialize para volver al comportamiento normal.

En términos generales, los observables son excelentes para el flujo de datos, mientras que el flujo de control suele ser arduo (saltos, bucles, bifurcaciones condicionales, etc.).

Consulte la documentación de Notification aquí: http://reactivex.io/rxjs/class/es6/Notification.js~Notification.html .

Consulte la documentación de materialize aquí: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-materialize

Entonces, si desea lidiar con los errores sin detener su fuente observable, puede hacer algo así:

 function process(source, success, error) { return source.materialize() .map(function(notification){ const value = notification.value; // that is the actual message data if (notification.kind === 'N') { // that is a next message, we keep it a next message return Notification.createNext(success(value)); } if (notification.kind === 'E') { // that is a error message, we turned into a next message return Notification.createNext(error(value)); } if (notification.kind === 'C') { // that is a completed message, we keep it a completed message return Notification.createComplete(); } }) .dematerialize() }

Luego puede usar esta función con su fuente observable y pasarle la función de éxito y error que procesa el valor transmitido. Como puede ver, la técnica aquí es convertir un mensaje de error en un mensaje normal y luego volver a la normalidad.

Esto se hace desde la parte posterior de mi cabeza, por lo que no se ha probado, así que mantenme actualizado si te fue útil. Usé una técnica similar muchas veces con Rxjs v4, creo que debería traducirse a Rxjs v5 de manera directa.

over 4 years ago · Santiago Trujillo Report

0

Lo que estás preguntando es literalmente romper el contrato del Observable. Un Observable se define como un productor de 0 o más valores, y si el productor ha terminado de producir valores, llamará al controlador complete en su observador, y si hay un error, llamará a error .

Pero una vez que llama complete OR error , su contrato es que nunca volverá a next a su observador.

Hay formas de evitar esto: al componer sus observables correctamente, puede reanudar su transmisión con un nuevo observable. Pero sin contexto adicional, es difícil guiarte más. La idea básica es usar el operador .catch en su cadena observable para crear un nuevo observable en caso de error, pero nuevamente, se necesitaría contexto adicional para proporcionar un ejemplo.

Editar:

Como agregó amablemente @cartant, vea el contrato observable

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!