rediriger après appel ajax et ignorer .always

J'ai un appel ajax standard de jQuery comme ci-dessous.

Je voudrais vérifier si le tableau json retourné demande une nouvelle page, et si oui, allez-y et n'exécutez pas le callback .always.

Y a-t-il un moyen simple de le faire?

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 a une variable go_location telle que browse.html i.e. array ['go_location'] = 'browse.html'
ajouté l'auteur Ray S., source
@ Dipak ne sais pas ce que tu veux dire. cela pourrait être une réponse?
ajouté l'auteur Ray S., source
@Rocky Je pensais que .done est d'abord exécuté, puis après cela, .always est exécuté. Voulez-vous dire. est toujours exécuté en premier?
ajouté l'auteur Ray S., source
Je l'ai testé, en mettant une alerte dans chacun, et l'alerte en fait surgit en premier, puis l'alerte en.
ajouté l'auteur Ray S., source
@Rocky merci rocky, juste pour m'assurer que je comprends, fait .done toujours courir avant .always (en supposant le succès)
ajouté l'auteur Ray S., source
Que faites-vous dans always ?
ajouté l'auteur Satpal, source
Pourquoi ne pas casser et revenir en cas de succès
ajouté l'auteur dipak_pusti, source
Voulez-vous dire que la page redirige votre code HTTP, c'est-à-dire 30X ? ou que le JSON a une variable go_location ?
ajouté l'auteur nrathaus, source
@Ray S. Oui, il fonctionnera toujours dans l'ordre que vous avez appelé. Mais comme je l'ai dit avant que le .always ne soit déclenché, peu importe ce que votre résultat est (succès/échec).
ajouté l'auteur Rocky, source
@Ray S. C'est parce qu'il n'y avait pas de retard dans la demande. Ici toutes les fonctions ont un poids égal. Lisez-le en anglais et vous comprendrez. Envoyer la requête Ajax, si c'est fait, exécutez la fonction done, si elle échoue, lancez la fonction fail mais quel que soit le résultat, exécutez la fonction always. Donc, je dirais que vous pouvez déplacer le code en fonction toujours à la fonction fait juste après votre condition if else. Et dans votre déclaration if, vous pouvez faire un retour pour rompre l'appel toujours.
ajouté l'auteur Rocky, source
@Ray S. Oui fait est exécuté en premier mais seulement après avoir reçu la réponse. Mais les fonctions restantes ne sont pas. Ils sont exécutés immédiatement après le déclenchement de la requête Ajax. Essayez de déplacer le code dans la fonction done.
ajouté l'auteur Rocky, source
Eh bien, le 'toujours' sera déclenché avant même que vous obteniez la réponse Ajax. Si vous voulez exécuter du code après la requête Ajax, déplacez-le dans la fonction Ajax.
ajouté l'auteur Rocky, source

2 Réponses

Comme le nom le dit 'always' , .always() est exécuté dans les deux cas, succès ou échec. Vous ne voulez pas exécuter .always() en cas de réussite, mais en cas d'échec, ce qui n'est pas possible. Vous appelez trois méthodes à savoir .done() , .fail() et .always() sur la réponse ajax. Toutes les méthodes sont déclenchées dès que ajax est terminé [. done() et .alway() en cas de succès sinon .fail() et .always() ]. Nous savons que jquery/js est asynchrone donc même une instruction return dans une autre méthode ne peut pas arrêter l'exécution de .always() . Dans votre cas, seule l'option n'utilise pas la méthode .always() . Le succès ou l'échec de l'état, que ce soit .done() ou .fail() est exécuté. Ainsi, vous pouvez déplacer vos instructions de méthode .always() vers ces méthodes si nécessaire.

    $.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
ajouté
Dites-vous .done sera toujours exécuté avant .always (en supposant le succès de la requête ajax)?
ajouté l'auteur Ray S., source
Les deux sont déclenchés dans l'ordre dans lequel ils sont enchaînés. Comme je l'ai mentionné jQuery est asynchrone et .always() n'attendra pas la fin de .done ().
ajouté l'auteur Airan, source

Je ne comprends pas vraiment pourquoi vous avez une fonction .always mais je pense que vous pourriez essayer ceci:

$.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
ajouté
le succès est-il le même que le .done? très peu clair de la documentation quelle est la différence entre tous ces gestionnaires .done. toujours
ajouté l'auteur Ray S., source
Je pense que .success est déprécié
ajouté l'auteur Ray S., source
Je ne suis pas vraiment familier avec .done et .always mais .success est exécuté lorsque le serveur envoie une réponse à l'appel AJAX.
ajouté l'auteur Arnelle Balane, source