Tengo una suscripción en un componente de la aplicación angular donde necesito descargar un archivo PDF de la respuesta.
Estoy descargando un archivo PDF después de que se haya llamado al método window.open() y luego necesito cerrar la pestaña actual (nueva abierta) a través del método window.close() .
El método window.close() debe ejecutarse solo después de que se completa el evento de carga del objeto de la window y se descarga el archivo PDF, pero el evento de carga no se activa.
Aquí está el código:
.subscribe( (res: any) => { if (response) { const formData: string = response.replace(/\n/g, ''); const win: any = window.open('', '_blank'); // open new tab win.document.write(formData); // NOT FIRED win.addEventListener('load', () => { // submit form received in response win.close(); // NOT CALLED }, false ); } } );Nota: No quiero usar la función setTimeout() y llamar a window.close() allí, ya que el tiempo de descarga puede variar según diferentes factores (como el entorno del navegador, el tamaño del archivo, etc.), de lo contrario, es posible para resolver este problema usando:
win?.setTimeout(() => { win?.close(); }, 3000);Entonces, ¿qué está mal aquí? Cualquier ayuda es apreciada.
Mirando su código, parece que está agregando el oyente de carga en la window y no en la win , que es probablemente lo que desea.
Aquí está la forma en que normalmente uso.
No tengo una forma de probar esto con archivos pdf, pero la forma en que descargo los archivos recibidos con una solicitud http es usando Blob. Como esto:
const blob = new Blob([res], {type : 'application/pdf'}); const url = window.URL.createObjectURL(blob); window.open(url);Según mi experiencia con otros tipos de archivos, esto abre la pestaña, comienza a descargar el archivo y se cierra (mientras el archivo aún se está descargando).
¡No dude en pedir aclaraciones si es necesario!