solucionar descargar como javascript rxjs rxjs5

javascript - descargar - Observable finalmente en Suscribirse



void(0) javascript href (3)

Ahora estoy usando RxJS 5.5.7 en una aplicación angular y el uso del operador de finalize tiene un comportamiento extraño para mi caso de uso, ya que se dispara antes de las devoluciones de llamada de éxito o error.

Ejemplo simple:

// Simulate an AJAX callback... of(null) .pipe( delay(2000), finalize(() => { // Do some work after complete... console.log(''Finalize method executed before "Data available" (or error thrown)''); }) ) .subscribe( response => { console.log(''Data available.''); }, err => { console.error(err); } );

He tenido que usar el add medhod en la suscripción para lograr lo que quiero. Básicamente, una devolución de llamada finally después de que se realicen las devoluciones de llamada de éxito o error. Como un try..catch..finally block o Promise.finally .

Ejemplo simple:

// Simulate an AJAX callback... of(null) .pipe( delay(2000) ) .subscribe( response => { console.log(''Data available.''); }, err => { console.error(err); } ); .add(() => { // Do some work after complete... console.log(''At this point the success or error callbacks has been completed.''); });

De acuerdo con este artículo , las funciones onComplete y onError de la subscribe son mutuamente excluyentes.

onError onComplete eventos onError o onComplete se activarán en mi subscribe .
Tengo un bloque lógico que debe ejecutarse si recibo un error o si termino mi flujo de información con éxito.

Busqué algo como finally en Python , pero todo lo que encontré es finally que debe adjuntarse al observable que creo.

Pero quiero hacer esa lógica solo cuando me suscribo, y después de que la transmisión haya finalizado, ya sea con éxito o con un error.

¿Algunas ideas?


La variante actual "pipable" de este operador se llama finalize() (desde RxJS 6). El operador "parche" anterior y ahora en desuso fue llamado finally() (hasta RxJS 5.5).

Creo que el operador finalize() es realmente correcto. Tu dices:

hacer esa lógica solo cuando me suscribo, y después de que la transmisión ha finalizado

lo cual no es un problema, creo. Puede tener una sola source y usar finalize() antes de suscribirse si lo desea. De esta manera, no es obligatorio que use siempre finalize() :

let source = new Observable(observer => { observer.next(1); observer.error(''error message''); observer.next(3); observer.complete(); }).pipe( publish(), ); source.pipe( finalize(() => console.log(''Finally callback'')), ).subscribe( value => console.log(''#1 Next:'', value), error => console.log(''#1 Error:'', error), () => console.log(''#1 Complete'') ); source.subscribe( value => console.log(''#2 Next:'', value), error => console.log(''#2 Error:'', error), () => console.log(''#2 Complete'') ); source.connect();

Esto imprime a la consola:

#1 Next: 1 #2 Next: 1 #1 Error: error message Finally callback #2 Error: error message

Enero de 2019: actualizado para RxJS 6


Lo único que funcionó para mí es esto

fetchData() .subscribe( (data) => { //Called when success }, (error) => { //Called when error } ).add(() => { //Called when operation is complete (both success and error) });