IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Envoi de plusieurs requetes AJAX en meme temps


Sujet :

jQuery

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut Envoi de plusieurs requetes AJAX en meme temps
    Bonjour,

    Sur ma page web, j'ai plusieurs boutons qui envoient des requêtes AJAX.

    Comment faut-il que je gère ça ? ... j'ai cru comprendre qu'il ne fallait envoyer qu'une seul requête AJAX a la fois car on pouvait avoir des problèmes sur certains navigateurs : c'est à moi de le gérer ou le framework le fait automatiquement (que se passe t-il si j'envoie plein de requête les une à la suite des autres sans attendre les réponses ?) ?


    merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 205
    Points : 285
    Points
    285
    Par défaut Ta question est
    assez générale et il est difficile d'y répondre de manière concrète. Par rapport aux éléments que tu donnes je pense que par défaut jquery pourra gérer l'ensemble de tes requêtes sans gros problème puisque celles ci sont envoyées lors d'un click sur des boutons.

    Néanmoins tu peux avoir un nerveux de la souris qui prendra un malin plaisir à jouer avec tes boutons et avec tes nerfs.
    Pour le moment je vois 2 solutions à ton problème , la deuxième pouvant être aménager à ton gout :

    - Passer en mode synchrone : il s'agit d'une options à activer dans $.ajax. Cette option async , bloque tout traitement tant que la requête ajax précédente n'est pas revenu. Mais c'est une solution à utiliser en dernier recours , par exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $.ajax({
      async : false,
      url: 'ajax/test.html',
      success: function(data) {
        alert('bravo')
      }
    });
    - La deuxième solution est beaucoup plus élégante et performante, il s'agit de récupérer tes données de préférence au format json. Dans ton objet json renvoyé par le serveur tu vas avoir plusieurs 'cle' : 'valeur' , parmi ces éléments tu vas passer ce que tu souhaites récupérer et une fonction de callback pour le javascript. Concrètement si tu cliques sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    // Ta fonction ajax va être la suivante
     
    $.ajax({
      dataType: "json",
      url: 'ajax/test.html',
      success: function(data) {
        if (data.callback) eval(data.callback + '(' + data.resultat + ')' );
      }
    });
     
    // ton serveur devra renvoyer des donnees au format json
    // par exemple { "resultat" :  "totto est sympa"  , "callback" : "ma_fonction"}
    // quand tu recuperes cela du serveur tu dois avoir une fonction ma_fonction() que voici
     
    function ma_fonction(resultat){
     
    	alert(resultat);
    	// ou ce que tu veux ....
    }
    Dans ce cas même si ton internaute est un peu agité les traitements seront toujours fait correctement car l'appel à la fonction de callback te garantie que chaque retour en ajax soit traité par la bonne fonction.

    Sinon je sais qu'il existe un plugin pour jquery qui met dans une 'queue' tes requêtes ajax pour assurer un traitement 'ordonné'. Mais je ne l'est jamais testé.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    sauf erreur de ma part, il me semble qu'en utilisant la seconde méthode, tu as quand même le risque d'avoir deux requêtes AJAX en cours de traitement en même temps et donc risque de bug, non ?

    => par contre j'ai un doute : je ne retrouve plus le lien qui disais qu'il ne fait pas créer deux objets AJAX en même temps

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 205
    Points : 285
    Points
    285
    Par défaut En fait
    tu ne peux lancer deux requêtes en simultanées. Par contre il est tout a fait possible que les retours des requêtes ne soient pas dans le même ordre que celui de tes appels en ajax.

    C'est pour çà que la solution utilisant du json et une fonction de callback te permet de gérer correctement les retours sans se soucier de l'ordre d'envoie des requêtes en ajax.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    Citation Envoyé par Sourrisseau Voir le message
    tu ne peux lancer deux requêtes en simultanées.
    tu peux me montrer un bout de code qui envoie deux requetes en simultanées stp (car là je m'embrouille un peu => je ne vois pas la différence : pour reçevoir deux requtes pour moi il faut avoir auparavant envoyé deux requêtes) ?

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 205
    Points : 285
    Points
    285
    Par défaut Quand
    je parlais de simultanée cela veux dire littéralement : 'en même temps'. Ce qui est impossible. Tu peux envoyer avec un écart très faible et lancer plusieurs requêtes avant d'avoir une réponse.

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Bonjour, quelques petites remarques.

    1. Le premier « A » de ajax signifie asynchrone. Sourrisseau l’a déjà dit, les requêtes synchrones c’est une mauvaise idée, mais je veux insister sur ce point pour plusieurs raisons.
    • L’interface du navigateur est gelée pendant toute la durée de la requête. C’est mauvais pour l’ergonomie, ça va donner une mauvaise impression à l’utilisateur ou l’utilisatrice ; et dans le pire des si la requête n’aboutit pas à cause d’une latence du réseau ou d’une surcharge du serveur, l’interface va rester gelée, à moins que tu ne gères ce cas à la main dans ton script.
    • C’est une technique dépréciée et les consoles des navigateurs récents affichent un avertissement, par exemple sous Firefox :
      L’utilisation d’XMLHttpRequest de façon synchrone sur le fil d’exécution principal est obsolète à cause de son impact négatif sur la navigation de l’utilisateur final. Consulter http://xhr.spec.whatwg.org/ pour plus d’informations.
    • Il faut s’attendre, aujourd’hui ou à l’avenir, à ce que certains outils de mesure de performance comme PageSpeed te retirent des points à cause de ça.


    2. Je n’ai jamais entendu parler de contre-indication à lancer plusieurs requêtes ajax en même temps. D’un point de vue réseau, une requête ajax est une requête HTTP comme les autres, et les navigateurs, depuis les premières heures de leur histoire, sont conçus pour faire des requêtes HTTP.

    Si le pipelining est activé dans les options de configuration, le navigateur lancera un certain nombre de requêtes en parallèle (jusqu’à un nombre maximum qui est aussi une option de configuration), sinon il les ordonnera dans une file et les lancera les unes à la suite des autres.

    Bien sûr il faut rester raisonnable dans la quantité de requêtes : c’est irréaliste de vouloir en faire une centaine en même temps. Mais les complications se situent plus au niveau du serveur (charge à supporter) et des nœuds intermédiaires sur le réseau (par exemple, risque de bannissement si l’utilisateur passe par un proxy, ou si ton serveur est protégé par un service anti-DDoS).

    3. Attention avec eval, c’est très rarement une bonne idée. Se baser sur l’échange de code exécutable entre le serveur et le client, c’est une faille de sécurité. En l’occurence, le serveur pourrait être usurpé, par exemple avec une attaque par empoisonnement DNS, et on se retrouve à exécuter du code inconnu côté client. Je vous laisse imaginer les conséquences.
    C’est bien mieux de ne faire transiter que des données, et d’utiliser JSON.parse pour les interpréter côté client.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    ok merci pour les infos, j'avais un doute sur le nombre simultanées de requête que les navigateurs pouvaient traiter.
    Je pense que l'on peut fermer le sujet

  9. #9
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 749
    Points
    4 749
    Par défaut
    Oui, il n'y pas de limitations sur le nombre de requêtes Ajax lancées les unes à la suite des autres, et avant même que l'une d'entre elles ne puisse recevoir une réponse.

    Mais il faut aussi se prémunir contre les clickeurs fous qui pressent 100 fois sur le même bouton tant qu'ils n'ont pas obtenu leur réponse et qui de ce fait envoient 99% de requêtes Ajax inutiles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir et traiter plusieurs requetes mysql en meme temps ?
    Par Benamour Jr dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2010, 07h57
  2. requet sql "GO", pour plusieurs requetes sql au meme temps
    Par abbd dans le forum Développement
    Réponses: 3
    Dernier message: 25/05/2008, 15h08
  3. plusieurs requete sur le meme statement
    Par fafoula dans le forum JDBC
    Réponses: 1
    Dernier message: 17/04/2008, 09h18
  4. Filtres sur plusieurs champs/criteres en meme temps
    Par jeo13 dans le forum Macros et VBA Excel
    Réponses: 35
    Dernier message: 26/03/2008, 14h23
  5. Plusieurs requete pour un meme etat
    Par swissmade dans le forum IHM
    Réponses: 2
    Dernier message: 27/11/2007, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo