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

JavaScript Discussion :

[AJAX] Comment faire une boucle XMLHttpRequest qui marche ?


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [AJAX] Comment faire une boucle XMLHttpRequest qui marche ?
    Bonjour!
    Voici un problème que je n'arrive pas à résoudre. Merci à celui qui a déja rencontré ce type de problème de me venir en aide!

    Afin de diviser le traitement coté serveur je voudrais envoyer plusieurs appels XMLHttpRequest qui me retournent une valeur de controle. Ces valeurs sont aussi utilisées comme décompte pour signaler la progression au client. J'ai simplifié le code pour en montrer le principe.

    Ce qui se passe malheureusement, c'est que ce code n'affiche que le décompte final (0) et non les décomptes intermédiaires (5 puis 4, 3, 2, 1...). L'intruction Sleep est là pour ralentir le processus durant les tests : on devrait donc voir s'afficher un décompte de 5 à 0, de seconde en seconde.

    Pourquoi développer ce code ? Le but est d'écrire un code permettant de partitionner les processus coté serveur pour éviter les charges excessives et les timeout. Cette approche permettrait par exemple de manipuler des dizaines de milliers de contacts d'une table SQL en plusieurs fois, en retournant une notification de progression ( "nombre fiches traitées : 4300. Temps restant : 5 minutes").

    Explication des codes ci-dessous : la page XHR1.php contient un formulaire qui envoie une requete à la page XHR2.php.

    Code de la page d'envoi ( XHR1.php)
    ----------------------------------
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <head><script language="javascript">
     
    function request(f) {
    var method   = "POST";
    var filename = "XHR2.php";
     
     
    var xhr_object = null;
    if(window.XMLHttpRequest) // Firefox
    	xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // Internet Explorer
    	xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else { // not supporting
    	alert("Error");
    	return;
    }
     
    var countdown  = f.elements["countdown"].value;
    var data = "countdown=" + countdown;
     
    xhr_object.onreadystatechange = function () {
    	if(xhr_object.readyState == 4) {
    		var tmp = xhr_object.responseText;
    		// alert ( tmp );
    		f.elements["countdown"].value = tmp;
    		if ( countdown > 0 ) request(f);
    	}
    }
    xhr_object.open(method, filename, false);
    xhr_object.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr_object.send(data);
    xhr_object.abort();
    }
    </script>
    </head>
    <body>
    	<FORM onsubmit="return false;" action="">
    <INPUT id=countdown size=5 name=countdown>
    <BR>
    <INPUT onclick=request(this.form) type=button value="TEST"> 
    </FORM>
    </body>
    CODE de la PAGE TRAITEMENT ( XHR2.php)
    -----------------------------------
    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
     
    <?php
    header('Content-type: text/html; charset=iso-8859-1');
     
    if(isset($_POST["countdown"])) {
    	sleep (1);
    	$countdown = $_POST["countdown"];
    	if ( $countdown > 0 ) {
    		// FAIRE PROCESSING LONG DB/FICHIER
    		$somedelay = 1; // 1 COMME VALEUR D'EXEMPLE
    		// AJUSTE DECOMPTE
    		$countdown = $countdown - $somedelay;
    	}
    	echo $countdown;
    }
    ?>

  2. #2
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var count=0;
    while (count < 7) {
       requeteXHRSynchrone();
       count++;
    }

Discussions similaires

  1. Comment faire une boucle qui parcourt plusieurs feuilles d'un classeur
    Par fanta09 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/11/2017, 09h46
  2. [Smarty] comment faire une boucle
    Par wkd dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 19/08/2009, 13h36
  3. Réponses: 2
    Dernier message: 06/04/2007, 13h31
  4. [AJAX] comment faire une zone reactive
    Par didou038 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/12/2006, 12h51
  5. Comment faire une boucle ???
    Par HookerSeven dans le forum Access
    Réponses: 6
    Dernier message: 17/06/2005, 12h58

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