Estoy realizando algunas actividades como cargar, descargar, eliminar, editar... y para cada actividad estoy mostrando un estado como 'carga iniciada', 'carga completada', etc. Esto funciona absolutamente bien si estoy en la misma página. pero a veces el usuario puede hacer clic en el botón de descarga y puede navegar a una página diferente. En tal caso, veo que se llama a la API de descarga y se completa con éxito, pero el estado no se actualiza, sigue girando en 'descarga en progreso'. Aquí está mi lógica, ¿si estas cosas se pueden manejar de manera diferente?
download(){ let object = { message: '', subactivity: [] }; this.elements.foreach(e => { object.message = 'download in progress'; object.subactivity.unshift({ id: e.id, status: 'preparing', message: 'download inprogress', }) this.activity.unshift(object); await downloadElements(element); }); async downloadElements(element){ ... let result = await this.service.download(this.role,element).pipe(first()).toPromise(); if (result) { var arr2 = [{ id: element.id, status: 'success', message: 'download complete' }]; var res = this.activity[0].subactivity.findIndex(obj => { return obj.id === arr2[0].id; }); this.activity[0].subactivity[res] = arr2[0]; } const blob = new Blob(result, { type: contentType }); saveAs(blob, fileName);Si continúa manejando la descarga como un Observable en lugar de transformarlo en una Promesa, podría capturar el evento Observable completo y desde allí desencadenar cualquier cosa que necesite.
//pseudo-code this.service.download(this.role,element).subscribe( result=>{ //your result code }, (error)=>console.log(error), ()=>console.log('observable is complete) )