Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajax dans une boucle while navigateur crash

    26 octobre 2016 à 13:13:39

    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 :

    <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.

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2016 à 14:03:59

      Je ne pense pas que ton navigateur crash à cause du while, tu as débuggué ton application dans la console avant que ça ne crash ?

      Pense aussi à regarder au niveau du network de la console du navigateur si tu n'as pas de soucis avec ton service appellé 

      -
      Edité par David Dupuis 26 octobre 2016 à 14:04:54

      • Partager sur Facebook
      • Partager sur Twitter
        26 octobre 2016 à 15:14:17

        David Dupuis a écrit:

        Je ne pense pas que ton navigateur crash à cause du while, tu as débuggué ton application dans la console avant que ça ne crash ?

        Pense aussi à regarder au niveau du network de la console du navigateur si tu n'as pas de soucis avec ton service appellé 

        -
        Edité par David Dupuis il y a 39 minutes


        J'avoue ne pas avoir compris ...

        Le navigateur a du mal lorsqu'il y a plus de 3 lignes dans le textarea (si c'est <= 3lignes ca fonctionne très bien) , donc si ce n'est pas à cause de while (ou du if) , je ne vois pas trop..

        -
        Edité par LevierMonar 26 octobre 2016 à 15:17:17

        • Partager sur Facebook
        • Partager sur Twitter
          26 octobre 2016 à 15:27:49

          Avec un traitement simple, je n'ai aucun problème avec la boucle while : https://jsfiddle.net/xoa9cLt4/

          Ton i++ ne serait-il pas dans ton if ? Si c'est le cas, ça va générer une boucle infinie à coup sur!

          -
          Edité par David Dupuis 26 octobre 2016 à 15:29:53

          • Partager sur Facebook
          • Partager sur Twitter
            26 octobre 2016 à 15:42:09

            Ce code (simple) fonctionne , mais il n'y a pas d'ajax , l'ajax s'execute en fond et donc si j'en ai 3 en background , la condition if sera ignoré et la boucle while tournera jusqu'à ce qu'une instance ajax ait fini (et donc qui enleve 1 à thread_count).

            Je ne peux pas mettre le i++ en dehors du if car sinon je ne traiterai pas toute les lignes du textarea.

            • Partager sur Facebook
            • Partager sur Twitter
              26 octobre 2016 à 18:03:46

              Salut ,

              Ah les boucles infinies ... Je ne vois pas plus mais voici une autre approche:

              mettre l'appel AJAX dans une fonction qui s’appellerait elle même par 'success'. cette fonction gérerait les lignes à envoyer.

              il suffit ensuite d'initialiser  le truc avec une boucle for qui limitera le nombre d'appels souhaités.

              Aucun risque d'emballement du système.

              Par compte, indépendamment de la méthode, les réponses étant asynchrone, l'ordre pourrait être perdu.

              Par ailleurs, ajouter les paramètres en texte brut à l'url peut générer des erreurs. il est préférable de les transmettre avec l'option data.

              par exemple:

              type: 'GET',
              data: { order: i, line: lines[i] },
              dataType: 'json',


              on envoi le n° de ligne avec et on attend une réponse en json qui comportera aussi le N° de ligne pour pouvoir ordonner les réponses.

              • Partager sur Facebook
              • Partager sur Twitter
                26 octobre 2016 à 20:47:00

                FredScuttle a écrit:

                Salut ,

                Ah les boucles infinies ... Je ne vois pas plus mais voici une autre approche:

                mettre l'appel AJAX dans une fonction qui s’appellerait elle même par 'success'. cette fonction gérerait les lignes à envoyer.

                il suffit ensuite d'initialiser  le truc avec une boucle for qui limitera le nombre d'appels souhaités.

                Aucun risque d'emballement du système.

                Par compte, indépendamment de la méthode, les réponses étant asynchrone, l'ordre pourrait être perdu.

                Par ailleurs, ajouter les paramètres en texte brut à l'url peut générer des erreurs. il est préférable de les transmettre avec l'option data.

                par exemple:

                type: 'GET',
                data: { order: i, line: lines[i] },
                dataType: 'json',


                on envoi le n° de ligne avec et on attend une réponse en json qui comportera aussi le N° de ligne pour pouvoir ordonner les réponses.


                hum , je n'ai pas tout compris ..

                • Partager sur Facebook
                • Partager sur Twitter

                Ajax dans une boucle while navigateur crash

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown