Tengo el siguiente código que espera a que una solicitud AJAX se complete o sea exitosa y luego se redirigirá a una URL diferente.
Así es como se ve mi solicitud AJAX
function UploadFile(contoller, File, RecordID, AuxID) { console.log("initialize uploading file: " + RecordID); const formData = new FormData(); formData.append('RecordID', RecordID); formData.append('AuxID', AuxID); formData.append('File', File); return $.ajax({ type: "POST", url: contoller, processData: false, contentType: false, cache: false, enctype: 'multipart/form-data', data: formData, dataType: 'json' }) }Tengo otra función que llama a la solicitud AJAX y redirige a una URL diferente si la respuesta es exitosa (es decir, el archivo se cargó al servidor con éxito)
UploadFile(controller, file, ID ).done( // redirects to different url ).fail( console.log("file failed to upload") );Sin embargo, observo que .done() siempre se ejecuta antes de que el archivo haya terminado de cargarse en el servidor.
Si uso el siguiente código con "éxito", entonces funciona bien. La función de devolución de llamada después del parámetro de éxito solo se llama después de que se haya completado el proceso de carga.
$.ajax({ type: "POST", url: controller, processData: false, contentType: false, cache: false, enctype: 'multipart/form-data', data: formData, success: () => { // redirects to url }) }, error: function (ret) { }, dataType: 'json' });Leí en otras publicaciones/documentación que el nuevo jquery reemplaza "éxito" con ".hecho ()", por lo que son básicamente lo mismo, ¿verdad? Sin embargo, no estoy seguro de por qué .done() no funciona para mi código.
Tanto el hecho como el error necesitan que se les pasen funciones de devolución de llamada.
$.ajax devuelve un objeto jqXHR. Este objeto contiene los métodos done y fail. De esta documentación tenemos:
diferido.hecho( doneCallbacks [, doneCallbacks] )
donde:
doneCallbacks Tipo: Function() Una función, o matriz de funciones, que se llaman cuando se resuelve el Diferido.
Así que un ejemplo se vería así:
$.get( "test.php" ).done(function() { alert( "$.get succeeded" ); });