redirigir después de la llamada ajax y saltar .always

Tengo una llamada ajax estándar de jQuery como a continuación.

Me gustaría comprobar si la matriz json devuelta está solicitando una nueva página y, en caso afirmativo, vaya allí y no ejecute la devolución de llamada .always.

¿Hay una manera simple de hacer esto?

var jqxhr = $.ajax({
    url: server_URL + '/index.php',
    type: 'post',
    dataType: "json",
    data: obj

}).done(function (data) {
    if (data['go_location']) {
        window.location.href = data['go_location'];
    } else {
        //other stuff
    }

}).fail(function() {
    alert("ajax error");

}).always(function() {
    //other code
});
0
JSON tiene una variable go_location como browse.html, es decir, array ['go_location'] = 'browse.html'
agregado el autor Ray S., fuente
@Dipak no está seguro de lo que quieres decir. eso podría ser una respuesta?
agregado el autor Ray S., fuente
@Rocky, pensé que .done se ejecuta primero, y después de eso, siempre se ejecuta. ¿Estás diciendo que siempre se ejecuta primero?
agregado el autor Ray S., fuente
Lo probé, poniendo una alerta en cada uno, y la alerta en hecho apareció primero, luego la alerta en. Siempre
agregado el autor Ray S., fuente
@Rocky, gracias Rocky, solo para asegurarme de que entiendo, .done siempre se ejecutó antes. Siempre (asumiendo el éxito)
agregado el autor Ray S., fuente
¿Qué estás haciendo en always ?
agregado el autor Satpal, fuente
¿Por qué no rompes y vuelves cuando el éxito
agregado el autor dipak_pusti, fuente
¿Está diciendo que la página redirige su código HTTP, por ejemplo, 30X ? o que el JSON tiene una variable go_location ?
agregado el autor nrathaus, fuente
@Ray S. Sí, siempre se ejecutará en el orden que haya llamado. Pero como dije antes, siempre se activará. Sin importar cuál sea su resultado (éxito/fracaso).
agregado el autor Rocky, fuente
@Ray S. Eso es porque no hubo un retraso en la solicitud. Aquí todas las funciones tienen el mismo peso. Léelo en un lenguaje sencillo y lo entenderás. Envíe la solicitud Ajax, si está lista, ejecute la función done, si falla, ejecute la función fail pero no importa cuál sea el resultado, finalmente ejecute la función always. Por lo tanto, diría que puede mover el código en función siempre a función realizada inmediatamente después de su condición if else. Y en su declaración if puede hacer una devolución para romper la llamada siempre.
agregado el autor Rocky, fuente
@Ray S. Yes done se ejecuta primero, pero solo después de recibir la respuesta. Pero las funciones restantes no lo son. Se ejecutan inmediatamente después de activar la solicitud de Ajax. Intenta mover el código dentro de la función completada.
agregado el autor Rocky, fuente
Bueno, el 'siempre' se activará incluso antes de obtener la respuesta Ajax. Si desea ejecutar algún código después de la solicitud Ajax, muévalo dentro de la función Ajax.
agregado el autor Rocky, fuente

2 Respuestas

Como su nombre dice 'siempre' , .always() se ejecuta tanto en caso de éxito como de error. No desea ejecutar .always() en estado satisfactorio pero en estado de falla, lo cual no es posible. Está llamando a tres métodos, a saber, .done() , .fail() y .always() en la respuesta ajax. Todos los métodos se activan tan pronto como se completa ajax [. hecho() y .alway() en caso de éxito .fail() y .always() ]. Sabemos que jquery/js es asíncrono, por lo que incluso la declaración de devolución en cualquiera de los otros métodos no puede detener la ejecución de .always() . En su caso, la única opción es no utilizar el método .always() . Cualquiera de los estados exitosos o fallidos, ya sea .done() o .fail() se ejecuta. Por lo tanto, puede mover sus declaraciones de métodos .always() a estos métodos si es necesario.

    $.ajax({
        url: server_URL + '/index.php',
        type: 'post',
        dataType: "json",
        data: obj
    }).done(function (data) {
        //Do something if ajax succeeds
        if (data['go_location']) {
            window.location.href = data['go_location'];
        } else {
            //other stuff
        }
    }).fail(function() {
        //Do something if ajax fails
    })
0
agregado
¿Estás diciendo que .done siempre se ejecutará antes. Siempre (asumiendo el éxito de la solicitud de Ajax)?
agregado el autor Ray S., fuente
Ambos se activan en el orden en que están encadenados. Como mencioné, jQuery es Asíncrono y .always() no esperará la terminación de .done ().
agregado el autor Airan, fuente

Realmente no entiendo por qué tienes una función .always pero creo que podrías probar esto:

$.ajax({
  url: server_URL + '/index.php',
  type: 'post',
  dataType: "json",
  data: obj,
  success: function(data) {
    if (data['go_location']) {
      window.location.href = data['go_location'];
    } else {
      //other stuff
    }
  },
  error: function(data) {
    alert("ajax error");
  }
}
0
agregado
¿El éxito es el mismo que el de .done? muy poco claro a partir de la documentación de cuál es la diferencia entre todos estos manejadores.
agregado el autor Ray S., fuente
creo que .success está en desuso
agregado el autor Ray S., fuente
No estoy realmente familiarizado con .done y .always pero .success se ejecuta cuando el servidor envía una respuesta a la llamada AJAX.
agregado el autor Arnelle Balane, fuente