2012-02-20 14 views
8

que tienen esta función para abrir una lista que el usuario está editando:¿Podría ser que Chrome cancele las solicitudes Ajax pendientes, una vez que el navegador se redirige a otra URL?

function unsetLock(id) { 
    $.ajax({ 
    type: "POST", 
    url: "/ajax.php?action=unsetLock", 
    dataType: 'json', 
    data: "id="+ id 
    }); 
    return true; 
} 

Cuando el usuario se desplaza fuera de la lista, tengo que cancelar el bloqueo:

unsetLock(lockID); 
document.location.href='/page/to/navigate/back/to.php'; 

Sin embargo, este desbloqueo veces funciona y otras veces no. Creo que es porque se ejecuta document.location.href, antes de que la llamada ajax haya sido realmente enviada al servidor.

¿Cómo puedo forzar el desbloqueo antes de pasar al usuario a la página siguiente?

En realidad, no necesito esperar el Ajax-Reply, ya que quiero redirigir al usuario, si tiene éxito o no. Solo quiero asegurarme de que esté siendo transferido al servidor.

Si coloco el document.location.href dentro de la función Ajax, esperará la respuesta.

Respuesta

7

Una forma muy maleducada de hacerlo es agregar: async: false, que bloqueará el navegador hasta que se complete la llamada AJAX. Por supuesto, si hay un problema y la llamada AJAX nunca se termina ...

Es la solución más rápida y fácil a su problema, pero probablemente no sea la mejor.

Yo, personalmente, tendría el bloqueo solo por veinte segundos (utilizando una marca de tiempo en la base de datos) y envío una llamada ajax cada diez segundos para volver a bloquear la página (si tiene sentido) usando setInterval(). De esta forma, la cerradura se desarmará unos segundos después de que alguien abandone la página, y es buena sin importar la situación (una falla de energía para el cliente no dejaría la página bloqueada para siempre, por ejemplo).

4

Quizás me falta algo, pero ¿por qué no utilizar la opción success en la llamada Ajax? Esto ejecutará cualquier resultado y se asegura de que llegue al servidor.

function unsetLock(id) { 
    $.ajax({ 
    type: "POST", 
    url: "/ajax.php?action=unsetLock", 
    dataType: 'json', 
    data: "id="+ id, 
    success: function(){ 
     document.location.href='/page/to/navigate/back/to.php'; 
    } 
    }); 
    return true; 
} 
+0

Porque, quiero redirigir al usuario, si la solicitud de Ajax tiene éxito, o no. – JochenJung

+0

Ok, pero también desea esperar la solicitud de ajax en caso de que * no * tenga éxito. Entonces, debe usar la opción 'success', ya que es la única forma de saber si ha tenido éxito. Pero en lugar de poner la redirección allí, cambie una 'var' allí y use' setInterval() 'cerca del lugar donde está llamando a la función' unsetLock'. Si la varilla marcada es verdadera, redirija; de lo contrario, después de algunos bucles se redireccionará independientemente. Básicamente, de esta manera le dará tiempo de llamada ajax para tener éxito. Creo que este es el mejor (¿el único?) Modo ya que no obtendrás un "error" claro y rápido de la llamada ajax. – kasimir

+0

No me interesa si la llamada tiene éxito o no. Solo me gusta asegurarme de que fue enviado. Pero veo que esto no es posible. Tengo que elegir entre esperar la respuesta de los servidores, o simplemente tener navegadores lentos para enviar el evento. – JochenJung

Cuestiones relacionadas