Tengo una aplicación que estoy escribiendo que modifica los datos en un objeto en caché en el servidor. Las modificaciones se realizan a través de una llamada ajax que básicamente actualiza las propiedades de ese objeto. Cuando el usuario termina de trabajar, tengo un botón básico para 'Guardar cambios' que les permite guardar los datos y vaciar el objeto en caché.jQuery llamada Ajax - Establecer valor de variable en caso de éxito
Para proteger al usuario, quiero advertirles si intentan navegar fuera de la página cuando se han realizado modificaciones en el objeto del servidor si no se han guardado. Entonces, creé un método de servicio web llamado IsInitialized que devolverá verdadero o falso según se hayan guardado o no los cambios. Si no se han guardado, quiero avisar al usuario y darles la oportunidad de cancelar su solicitud de navegación.
Aquí está mi problema - aunque tengo las llamadas funcionando correctamente, parece que no puedo obtener la llamada exitosa ajax para establecer el valor de la variable en su función de devolución de llamada. Aquí está el código que tengo ahora.
////Catches the users to keep them from navigation off the page w/o saved changes...
window.onbeforeunload = CheckSaveStatus;
var IsInitialized;
function CheckSaveStatus() {
var temp = $.ajax({
type: "POST",
url: "URL.asmx/CheckIfInstanceIsInitilized",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(result) {
IsInitialized = result.d;
},
error: function(xmlHttpRequest, status, err) {
alert(xmlHttpRequest.statusText + " " + xmlHttpRequest.status + " : " + xmlHttpRequest.responseText);
}
});
if (IsInitialized) {
return "You currently have unprocessed changes for this Simulation.";
}
}
Siento que podría estar intentando utilizar la devolución de llamada de Success de forma inadecuada. ¿Cómo configuro una variable de javascript en la devolución de llamada de Success para poder decidir si se debe solicitar o no al usuario con el mensaje de cambios no guardado?
Como acabo de señalar, estoy realizando una llamada asincrónica, lo que significa que se llama al resto del código antes de que regrese mi método. ¿Hay alguna forma de usar esa llamada ajax, pero aún así atrapar el evento window.onunload? (sin hacer sincronismos ajax)
Acabo de recibir un correo electrónico diciendo que una pregunta mía desde los 5 años pasado fue "marcado como duplicado". La pregunta "original" tiene solo un año. ¡Máquinas de tiempo go-go! :) Es una respuesta más profunda. – Nathan