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 dans une boucle while , navigateur crash ?


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Ajax dans une boucle while , navigateur crash ?
    Bonjour ,
    Je cherche à faire en sorte que mon script ajax se lance maximum X fois (ici 3) , chaque instance doit traiter une ligne du textarea , j'ai donc fait ceci :

    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
    <textarea></textarea>
    <script type="text/javascript">
    function start(){
    	var lines = $('textarea').val().split('\n');
    	var i = 0;
    	var thread_count = 0;
    	var div = document.getElementById('logs');
    	while(i < lines.length) {
    		if(thread_count < 3){
    			thread_count ++;
    			$.ajax({
    				url: "monscript.php?line="+lines[i],
    			type: 'GET',
    			dataType: 'text',
    			success : function(msg){
    						div.innerHTML = div.innerHTML + msg + "<br>";	
    						thread_count--;
    					},
    			error : function(){
    						alert("Une erreur Ajax.");
    					}
    			});
    			i++;
    		}
    	}
    };
    </script>
    <input type="button" value="run" onclick="start()"/>
    <div id="logs">
    </div>

    Mais , soucis , le navigateur à vraiment du mal à supporter la boucle while (vu que je suppose que c'est le problème) , quelqu'un aurait une solution pour garder cette solution d'instance simultanées en évitant de faire crash monsieur le navigateur ?
    Merci.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    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 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Il y a une faille dans ton algorithme. Tu as un test imbriqué dans une boucle, selon ce schéma :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (A) {
      if (B) {}
    }
    Quand B est faux, c’est équivalent à :
    Ton instruction i++ se trouve dans le corps du test B. Ton crash est dû tout bêtement à une boucle infinie.

    Si ton objectif est de limiter le nombre de requêtes concurrentes à 3, il ne faut pas tester ce nombre dans le while. Le while ne fait que lancer les 3 premières requêtes, le reste doit être géré par les fonctions de callback.
    Avec jQuery tu as l’évènement complete qui te donne la possibilité d’agir à la fin d’une requête, que celle-ci ait réussi ou échoué.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Avec jQuery tu as l’évènement complete qui te donne la possibilité d’agir à la fin d’une requête, que celle-ci ait réussi ou échoué.
    petite precision :
    jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); (added in jQuery 1.6)
    An alternative construct to the complete callback option, the .always() method replaces the deprecated .complete() method.
    https://api.jquery.com/jQuery.ajax/
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  4. #4
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Si ton objectif est de limiter le nombre de requêtes concurrentes à 3, il ne faut pas tester ce nombre dans le while. Le while ne fait que lancer les 3 premières requêtes, le reste doit être géré par les fonctions de callback.
    Avec jQuery tu as l’évènement complete qui te donne la possibilité d’agir à la fin d’une requête, que celle-ci ait réussi ou échoué.
    C"est exactement ce que je souhaite faire , cependant , même avec cette indication je ne vois pas comment faire...

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    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 093
    Points : 6 754
    Points
    6 754
    Par défaut
    J’allais te proposer une solution basée sur les méthodes queue et dequeue de jQuery, mais je n’ai pas l’impression qu’elles permettent de lancer un certain nombre de requêtes simultanées et de mettre les autres en attente.


    Dans tous les cas, tu dois faire une file d’attente de requêtes. Je te donne l’idée générale et je te laisse gérer les détails, ok ?

    D’abord, la file, c’est un simple tableau. JS n’a pas d’objet spécial comme dans certains langages pour représenter précisément une file, mais les tableaux jouent ce rôle si tu utilises conjointement leurs méthodes push et shift (ou unshift et pop).

    Pour mettre une requête en attente, n’appelle pas $.ajax directement. Prends l’objet {} qui contient les paramètres de la requête, c’est cet objet que tu mets dans la file d’attente. Il te suffira de passer cet objet à $.ajax au moment voulu.

    Ta boucle while parcourt les lignes de ton textarea. Pour éviter de t’embrouiller encore avec le i, je te conseille d’opter pour une boucle for, voire même pour la méthode forEach. Certains diront que c’est moins performant, mais ça te permet d’éviter le piège du i qui a sa valeur finale partout.

    Ta boucle va faire deux choses selon le nombre de requêtes actuellement en cours. Soit ce nombre n’est pas au maximum et elle lance une nouvelle requête immédiatement ; soit elle met la requête dans la file d’attente.

    Dans la fonction always (et non pas complete, merci Doksuri pour la précision), tu vas regarder s’il reste des requêtes en attente, et le cas échéant en retirer une pour la lancer. C’est également dans cette fonction always que tu détecteras que toutes les requêtes sont terminées, et appelleras une fonction de finalisation si besoin (par exemple, remettre les résultats dans l’ordre, car tu n’as aucune garantie qu’ils vont arriver dans l’ordre).

    Évidemment ce n’est plus success qui gère la file de requêtes, donc tu peux retirer l’instruction thread_count--;. Par contre tu auras peut-être besoin de gérer thread_count dans always.


    Je vais te laisser chercher un peu, mais n’hésite pas à revenir poser des questions si tu bloques
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/04/2012, 11h31
  2. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  3. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  4. Réponses: 6
    Dernier message: 17/06/2005, 16h51
  5. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51

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