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

AJAX Discussion :

[AJAX] XMLHTTPRequest Requête simultanée


Sujet :

AJAX

  1. #1
    Membre à l'essai
    Homme Profil pro
    CyberSécurité
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : CyberSécurité

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 24
    Points
    24
    Par défaut [AJAX] XMLHTTPRequest Requête simultanée
    Bonjour,

    J'aimerais savoir s'il est possible de limiter les requêtes simultannées XHR ?
    J'ai une boucle qui lit un fichier JSON et qui envoie une requête XHR a chaque ligne (100 lignes).

    Le problème est qu'il envoi 100 requêtes en même temps et que le serveur de l'autre côté ne gére pas çà (Google)

    Le but est d'injecter 100 nouvelles entrées dans un calendrier Google via Google Calendar API.
    Dans ce cas, XHR et le fichier JSON ne concerne pas l'API de Google.

    En comparaison, Mootools gére très bien çà dans le REQUEST avec l'option LINK: CHAIN. Mais je ne peux pas l'utiliser car CORS ne gére pas les entête X-Requested-With et Mootools ne permet pas de supprimer cette entête.

    Voila merci en espérant que vous pouvez m'aider.

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    as tu essayé d'envoyer la requête suivante quand la précédente à aboutie?

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Je pense surtout que tu as essentiellement un problème de conception...
    Prévoir d'envoyer une centaine de requêtes simultanées n'est pas viable, tu devrais penser à rapatrier toutes les données en une seule fois puis faire les traitements adaptés.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Membre à l'essai
    Homme Profil pro
    CyberSécurité
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : CyberSécurité

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Je pense surtout que tu as essentiellement un problème de conception...
    Prévoir d'envoyer une centaine de requêtes simultanées n'est pas viable, tu devrais penser à rapatrier toutes les données en une seule fois puis faire les traitements adaptés.
    Je pense bien mais l'api de google ne le permet pas. J'aurais bien aimer envoyé tous un JSON bien formaté...

    La solution que j'ai trouvé a été d'envoyé les requêtes, les une aprés les autres avec un setTimeout d'une seconde qui s’incrémente à chaque nouvelle connection et voila ^^

    Merci pour vos réponses

  5. #5
    Membre du Club

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 30
    Points : 66
    Points
    66
    Par défaut
    Salut,
    Dans l'hypothèse où vos données J.S.O.N sont stockées dans un tableau, 3 Solutions sont possible
    1 - vous utilisez jQuery
    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
     
    index=-1
    function sendRequest()
    {
    //Arreter le timer
    clearTimeout(_timer);
    // incrémenter l'index
    index++
    if(_request[index]!=undefined){
    $.ajax({
    url:[votre_url]
    type:"POST",
    data:_request[index],
    success:function(data){
    //ici votre code en cas de succes
    _timer=setTimeout(function(){sendRequest();},1000);
    }
    })
    }
    }
    2 - Vous n'utilisez pas jQuery et envoyer vos requêtes en mode synchrone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function sendRequest(){
    clearTimeout(_timer)
    index++;
    if(_request[index]!=undefined){
    var xhr=new XMLHttpRequest();
    xhr.open("POST",[votre url],false);
    xhr.send(_request[index])
    if(xhr.responseText!=undefined){
    //votre code
    _timer=setTimeout(function(){sendRequest();},1000);
    }
    }
    }
    3 - Vous n'utilisez jQuery et envoyer vos requête en mode asynchrone
    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
     
    function sendRequest(){
    clearTimeout(_timer)
    index++;
    if(_request[index]!=undefined)
    {
     var ajax=new XMLHttpRequest();
     ajax.open("POST",[votre url],true);
    ajax.send(_request[index]);
    ajax.onReadyStateChange=function(){
    if(ajax.readyState==4){
    if(ajax.statut!=500&&ajax.statut!=404){
    //ici votre code
    _timer=setTimeout(function(){sendRequest();},1000);
    }
    }
    }
    }
    }
    Evidemment je part du principe qu'il faille envoyer vos donnée JSON en POST, sans quoi la requête ne peut fonctionner correctement.
    En résumer le principe est de stocker vos requête JSON dans un array en variable globale, créer un index global et d'utiliser un fonction itérative pour envoyer une à une chaque requête.

    Bonne Chance

  6. #6
    Membre à l'essai
    Homme Profil pro
    CyberSécurité
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : CyberSécurité

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    waow super la réponse
    Complète ...

    Merci

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je m'incruste, car je ne comprends rien a ce débat
    Je croyais qu'Il était impossible d'envoyer des requêtes simultanées, puisque les programmes s'exécutent ligne par ligne !
    Donc la fonction AJAX (ou autre) ne peut être appelée qu’une par une.
    Ors cela crée une instance, a chaque fois, comme si la fonction se dédoublait.
    En cela JavaScript utilise cette méthode au même titre que le langage "C" par exemple.
    Si je calcule une fractale par AJAX, ce sera 5.000.000 d'appels en quelques secondes.

    Alors j'ai mal compris
    Ou bien c'est l'emploi des jQuery ou autres usines à gaz qui perturbent cette logique ?
    A++
    Christele

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Il est habituel pour la gestion des requêtes AJAX de créer une fonction créant l'objet XMLHttpRequest(), dans une version minimaliste, ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function creeXHR(){
        return new XMLHttpRequest();
    }
    ici, le new indique bien que cette fonction retourne à chaque fois une nouvelle instance de l'objet.
    A partir de là, il est possible d'envoyer plusieurs requêtes AJAX distinctes et différenciées.
    Ensuite, les navigateurs limitent le nombre de requêtes HTTP concurrentes, mais c'est une autre problématique.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Membre du Club

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 30
    Points : 66
    Points
    66
    Par défaut
    L’inconvénient c'est l'objet XMLHttpRequest.
    Selon la version d'internet explorer, l'objet ne peut pas être instancié.

    Pas de panique, Seb connait une parade à ce problème.
    Il existe plusieurs solutions plus ou moins similaires.

    La première la moins agile consiste a tester l'instanciation de l'objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var ajax={};
    try{
    ajax=new XMLHttpRequest();
    }catch(e){
    ajax=new ActiveXObject("Microsoft.XMLHTTP");
    }
    [...]
    La seconde consiste a factoriser l'instanciation par le biai d'une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function XMLGetInstance()
    var ajax={}
    {
    try{
    ajax=new XMLHttpRequest();
    }catch(e){
    ajax=new ActiveXObject("Microsoft.XMLHTTP");
    }
    return ajax;
    }
    La dernière consiste a créer un pseudo objet qui fera comme jQuery
    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
    21
    22
    23
    24
    25
    26
    function AJAX(p){
    var url=p.url;
    var type=(p.type!=undefined)?p.type:"GET";
    var asynch=(p.asynch!=undefined)?p.asynch:false;
    var data=(p.data!=undefined)?p.data:null;
    var xhr={}
    {
    try{
    xhr=new XMLHttpRequest();
    }catch(e){
    xhr=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhr.open(type,url,asynch);
    xhr.send(data);
    if(!asynch){
    this.responseText=xhr.responseText;
    }else{
    xhr.onReadyStateChange=function(){
    if(xhr.readyState==4){
    if((xhr.statut!=505&&xhr.statut!=404){
    p.success.call(xhr.responseText);
    }
    }
    }
    }
    }
    Pour l'appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ajax({
    url:"monurl.php",
    type:"POST",
    data:"var1=val1&var2=val2",
    success:function(data){
    alert(data);
    }
    })

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sdamart Voir le message
    L’inconvénient c'est l'objet XMLHttpRequest.
    Selon la version d'internet explorer, l'objet ne peut pas être instancié.
    Etc.
    Je crois rêver avec les anciens IE, on intencié
    "new ActiveXObject('Microsoft.XMLHTTP');" et donc pas besoins d'astuces pour je ne sais quelle raison.
    Depuis IE7 c'est encore plus simple puisque new XMLHttpRequest();
    est intégré.
    A++
    Christele

  11. #11
    Membre du Club

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 30
    Points : 66
    Points
    66
    Par défaut
    Je préfère gérer ce genre de cas même s'il est peu probable. Les seuls cas pour lesquels je m'abstient se sont les cas hautement improbable.

    De plus, pour ma part, j'utilise jQuery donc je me pose plus la question.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sdamart Voir le message
    Je préfère gérer ce genre de cas même s'il est peu probable. Les seuls cas pour lesquels je m'abstient se sont les cas hautement improbable.
    De plus, pour ma part, j'utilise jQuery donc je me pose plus la question.
    Je ne sais pas si tu sais exactement ce qu'est jQuery
    car en fait c'est un JavaScript compilé, qui utilises (ne t'y trompes pas),
    tout simplement XMLHttpRequest();

    A++
    Christele

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    car en fait c'est un JavaScript compilé, qui utilises (ne t'y trompes pas),
    tout simplement XMLHttpRequest();
    jQuery n'est QUE du javascript et utilise encore, sûrement très rarement les ActiveXObject, compatibilité oblige.
    Citation Envoyé par Extrait code jQuery
    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
    // Functions to create xhrs
    function createStandardXHR() {
    	try {
    		return new window.XMLHttpRequest();
    	} catch( e ) {}
    }
     
    function createActiveXHR() {
    	try {
    		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
    	} catch( e ) {}
    }
    // Create the request object
    // (This is still attached to ajaxSettings for backward compatibility)
    jQuery.ajaxSettings.xhr = window.ActiveXObject ?
    	function() {
    		return !this.isLocal && createStandardXHR() || createActiveXHR();
    	} :
    	createStandardXHR;

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Tu ne m'as pas bien lu, j'avais expliqué, deux messages plus haut, que plus pour longtemps car depuis IE7 XMLHttpRequest(); est intégré
    A++
    Christele

  15. #15
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Pour rappel, la place de IE6 est actuellement d'environ 0.5 %...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

Discussions similaires

  1. [AJAX] Requêtes simultanés en Ajax
    Par karastojko dans le forum AJAX
    Réponses: 0
    Dernier message: 30/04/2012, 10h59
  2. [AJAX] Requêtes simultanés AJAX
    Par MagnetiK dans le forum AJAX
    Réponses: 2
    Dernier message: 07/06/2009, 13h28
  3. [ajax] XMLHttpRequest et formulaire(<input type='file'>)
    Par Are-no dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/08/2006, 20h22
  4. [AJAX] XMLHTTPREQUEST ne se met pas à jour :-/
    Par franckarts dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/08/2006, 18h11
  5. [AJAX] XMLHttpRequest en parallèle
    Par narkhor dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/07/2006, 09h57

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