[RESOLU] Ajax sous Jquery en cascade

ViPHP
ViPHP | 1953 Messages

06 Juil 2016, 08:56

Bonjour à tous,

Actuellement je lance des Ajax() en cascade grâce à la fonction complete() :
$.ajax ({
url : "ajax.php",
data : {a : "essai", b : "essai2"},
type : "post",
cache : false,
complete : function (xhr, result) {
var reponse = xhr.responseText;
$.ajax ({
url : "ajax.php",
data : {c : "essai3", d : "essai4"},
type : "post",
cache : false,
complete : function (xhr, result) {
var reponse2 = xhr.responseText;

}
});
}
});


Cela fonctionne pour 2,3 fonctions en cascade mais quand on en a plus, cela devient très dur à suivre...

Je voudrais savoir (comme je ne connais pas la librairie Jquery par coeur), s'il existe un moyen de créer une "pile" de fonction Ajax qui s'effectuerait sous conditions : (voir exemple)
var fonction1 = $.ajax ({
url : "ajax.php",
data : {a : "essai", b : "essai2"},
type : "post",
cache : false,
complete : function (xhr, result) {
var reponse = xhr.responseText;
}
});

var fonction2 = $.ajax ({
url : "ajax.php",
data : {c : "essai3", d : "essai4"},
type : "post",
cache : false,
complete : function (xhr, result) {
var reponse2 = xhr.responseText;

}
});

=> si fonction1() est terminé correctement, lancer fonction2()


J'ai découvert la fonction Deferred() mais je n'ai pas compris, malgré mes recherches comment elle pouvait m'aider dans ce cas. Est ce que quelqu’un aurait une idée ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8413 Messages

06 Juil 2016, 15:34

salut,

est ce que le when / then ne pourrais pas t'aider ? https://api.jquery.com/jquery.when/ ?
C'est "chainable" y a p'tet moyen de les ajouter à la suite.

Je suis pas certain du résultat.


Peux être que la solution serais du coté de l’architecture du code.
Je ne sais pas si JQuery peux faire ça simplement mais perso je fonctionnerais plutôt par événement.
Dans le success de l'ajax N°1 => "fireEvent" cet event et récupéré et dans un traitement il fait la requête N°2
Dans le succes de l'ajax N°2 => "fireEvent" => idem pour trois etc.
L'avantage du système c'est que tu peux jouer les requêtes séparément (pas de duplication de code) et que tu facilement brancher une action sur le succès (ou failure ou complete) d'une requête ajax a partir du moment du moment ou cela balance l'event.

J'ai trouvé ça dans la doc : https://learn.jquery.com/events/introdu ... tom-events


@+

edit :
Avec le fonctionnement tu peux simplement faire un return de la requete ajax dans le premier then et d'ajouter un thrn ensuite (qui sera celui correspondant au résultat de la seconde requête).
Je n'ai pas regardé si jQuery le gère.
avec faut voir les promesse JS ;)
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 1953 Messages

29 Nov 2016, 23:12

Bon j'y suis arrivé en utilisant un paramètre que j'utilisais très peu : context.
Ce qui s'ecrit :

Code : Tout sélectionner

var fonction1 = $.ajax ({
  url : "ajax.php",
  data : {a : "essai", b : "essai2"},
  type : "post",   
  context : $('.essai1'),
  cache : false,
  complete : function (xhr, result) {                        
    var reponse = xhr.responseText;
        $(this).text(reponse);
        //ici $(this) == $('.essai1');
  }
});

var fonction2 = $.ajax ({
      url : "ajax.php",
      data : {c : "essai3", d : "essai4"},
      type : "post",   
      context : $('.essai2'),
      cache : false,
      complete : function (xhr, result) {                        
        var reponse2 = xhr.responseText;
        $(this).text(reponse2);
        //ici $(this) == $('.essai2');
      }
    });


Ainsi quel que soit l'Ajax qui revient en premier, il sera affecté à la classe indiquée dans context. C'est une version détournée de ce que je voulais faire mais qui fonctionne parfaitement.

++. les gens
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr