Estoy haciendo una simple llamada a window.location.href para iniciar la descarga de un archivo. Después de eso, llamo a un método para recargar una tabla.
window.location.href = url; this.getFileListing();Pero la recarga es demasiado rápida, porque href crea un registro en la base de datos.
Agregar un tiempo de espera de 1 segundo lo soluciona:
window.location.href = url; setTimeout(() => { this.getFileListing(); }, 1000);... pero eso es descuidado. ¿Cómo espero a que comience la descarga (por lo tanto, existirá el registro de la base de datos) antes de llamar a la recarga?
*Nota: la ubicación de la ventana no cambia. Solo estoy usando windows.location.href para llamar a una ruta local, que comienza a descargar un archivo. Por lo tanto, no creo que popstate o hashchange funcionen.
en lugar de iniciar la descarga con window.location.href para vue, puede usar axios para descargar un archivo y usar then método con la promesa de iniciar el método necesario
axios({ url: url, method: 'GET', responseType: 'blob' .then(response => (this.getFileListing()))Si está utilizando jQuery, puede probar algo equivalente con jquery get https://api.jquery.com/jquery.get/
var instance = this; $.get("fileToDownload", function() { //code when download is launch }).done(function() { instance.getFileListing(); })Mi solución: usar axios y MUCHO código para obtener la respuesta y pasarla al navegador. Tuve que analizar el nombre de archivo original. No estoy seguro si valió la pena. De hecho, puse las funciones en un mixin para poder agregarlas fácilmente a otros componentes.
downloadToBrowser(url, successCallback) { axios({ method: 'GET', url: url, responseType: 'blob' }) .then(response => { this.startDownload(response); successCallback(); }); }, startDownload(response) { var filename = response.headers['content-disposition'].split('=')[1]; const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', filename); document.body.appendChild(link); link.click(); },Luego llame al método, pasando la URL y la devolución de llamada:
this.downloadToBrowser(url, this.getFileListing);*Si tiene algún comentario sobre algo que podría hacer mejor/diferente, agradezco sus comentarios.