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 :

setInterval en attente


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut setInterval en attente
    Bonjour,

    Contexte : HTML/PHP,script PHP en asynchrone, JQuery et Ajax

    Voila le problème :
    Ma page principale s'affiche, et laisse le soin à un script PHP lancé en asynchrone de générer la liste demandé, qui peut être longue à générer.
    Ce script est lancé lors de l'event JQuery $(document).ready(). Donc la page à fini d'être affiché lors du lancement de ce script.
    J'exécute via un setInterval une fonction qui me permet de récupérer les pourcentage d'avancement pour une barre de progression.
    Mais cela ne marche pas.
    On dirait que le setInterval attend le retour du script générant la liste pour démarrer !
    C'est une procédure déjà utilisée, via une action sur un bouton, mais pas au démarrage de la page.
    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
     
    $(document).ready(function() {
    $.ajax({
            url: 'ajax/build_list.php',
            type : "GET",
            async : true,
            data : { sortBy : 'Code'},
           })
          idP=setInterval("updatePGB()", 25);
    });
    /**
     * Mise à jour de la barre de progression
     */
    function updatePGB() {
      		$.ajax({
    			url : "ajax/pgbar_build.php",
    			type : 'GET',
    			async : false,
    			dataType : 'text',
    			success : function(data,statusText,jqXHR) {
    					if (data!="END") {
    					    percent=parseInt(data);
    			  		    $("#pgb_step").width(percent*2);			
    					} else {
    						clearInterval(idP);
    						$('#progressBar').hide();
    						loadXML();
    					};
    				},
    		    error : function(jqXHR,statusText) {
    		    	alert("Erreur "+statusText);
    		    }
    		});
    }
    Ca fait un moment que je cherche, mais rien à faire !

    Quelqu'un à une idée ?

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    25 millisecondes

  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 : 54
    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 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Déjà, je serais particulièrement étonné que tes requêtes répondent en moins de 25ms, donc tu vas être rapidement confronté à la limite de requêtes HTTP simultanées imposée par le navigateur.

    Ensuite
    Donc la page à fini d'être affiché lors du lancement de ce script.
    certes, mais cela ne veut pas dire que tous les éléments remplacés (images, iframes, objets, ...) ont été récupérés, ce qui limite encore le nombre de requêtes AJAX possibles...

  4. #4
    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 : 54
    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 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Autre détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idP=setInterval(updatePGB, 25);
    est plus indiqué que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idP=setInterval("updatePGB()", 25);

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Autre détail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idP=setInterval(updatePGB, 25);
    est plus indiqué que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idP=setInterval("updatePGB()", 25);
    J'ai fait les 2.
    Idem

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Déjà, je serais particulièrement étonné que tes requêtes répondent en moins de 25ms, donc tu vas être rapidement confronté à la limite de requêtes HTTP simultanées imposée par le navigateur.

    Ensuite

    certes, mais cela ne veut pas dire que tous les éléments remplacés (images, iframes, objets, ...) ont été récupérés, ce qui limite encore le nombre de requêtes AJAX possibles...
    A la base j'était partie sur 250ms.
    Puis baisser pour provoqué une réponse ou une erreur.
    Je doit la remonter effectivement car cela ne sert à rien 25ms.

  7. #7
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Même 250 ms pour une requête ajax c'est court je trouve, même si ton serveur est balèze peut-être que la connexion de ton visiteur est plus lente.

    Une "progresse barre" rafraîchie toutes les 1 ou 2 secondes c'est largement suffisant je pense. (pour mes tchat "instantanés" je règle mon rafraîchissement en général entre 1.5 et 6 secondes)

    Sinon, pour éviter de surcharger ton serveur de requêtes alors que tu n'as peut-être même pas encore reçu la réponse de la précédente, tu peux mettre des conditions du genre :

    envoyer une nouvelle requête SI (j'ai reçu une réponse de la précédente OU si le dernier envoi de requête est trop vieux).

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    L'application est uniquement en intranet. Sur une autre partie de l'application, elle est défini à 1s, mais il est vrai qu'elle peut durer plus 30mn !
    Celle-ci à un délais de 2s à 5s suivant la demande. La barre de progression était un petit plus pour avertir l'utilisateur. Elle n'est pas vraiment nécessaire, mais le problème me tarabuste plus !

  9. #9
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Ca ne marche pas, c'est un peu court pour localiser l'erreur, as-tu un message d'erreur dans la console (ctrl+alt+j ) est-ce que les appels ajax sont bien envoyés et reçus ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Aucun message puisque les appels à la procédure de mise a jour de la barre de progression sont exécutés (mais à la fin).
    Les appels ajax se déroulent bien. D'ailleurs, j'ai été contraint de remplacer les $.get par des $.ajax, car pour une raison mystérieuse, elle ne lançait pas le script php. Et la aussi, pas de message.

  11. #11
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Salut, est tu sur du formatage de tes données par hasard?
    Car souvent ce genre d'erreur est assez redondant avec ce cas de figure.
    Solution au problème de formatage côté serveur pour PHP
    Bien préciser coté serveur l'encodage :

    1 - Il faut aussi flusher et vider le cache pour les problème de BOM.
    php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    flush();
    ob_start(); //starting output buffer
    php
    2 - xml
    petite function pour rendre clean le formatage xml des datas
    php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function clean_string_for_valid_xml($string) {
        $entities_array = array();
        foreach (get_html_translation_table(HTML_ENTITIES, ENT_QUOTES) as $character => $entity) {
            $entities_array[$entity] = '&#' . ord($character) . ';';
        }
        return str_replace(array_keys($entities_array), $entities_array, $string);
    }
    3 - charset à UTF-8 content-type text/xml pour le header
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mb_convert_encoding(clean_string_for_valid_xml($out), "UTF-8"); //converting output 
    header("Content-type: text/xml; charset=UTF-8");
    Si cela à déjà été fait ne tiens pas compte de mes remarques.

    Bonne chance

  12. #12
    Invité
    Invité(e)
    Par défaut
    salut,

    On dirait que le setInterval attend le retour du script générant la liste pour démarrer !
    async : false,
    ton appel est bloquant, et effectivement ya rien dautre qui sexecute tant que tas pas le retour du script.

    Tu peux enlever cette ligne pour passer en asynchrone (comme ca devrait toujours etre le cas) de toute facon les events sont ajoutes en stack cest a dire que tes retours seront geres (plus tard) mais dans lordre dans lequel tu les as recus

    edit: le derniere comment est a prendre avec pincettes, car si ca lag il se peut que tu aies le scenario
    appel 1 ->retour 2
    appel 2 ->retour 1

    cad que les appels se croisent parce que tu lag.
    Du coup, il faut faire une verif cote client pour tassurer que ce que tu recois est bien a jour.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Concepteur Développeur - Expert SIG
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Concepteur Développeur - Expert SIG
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par headmax Voir le message
    Salut, est tu sur du formatage de tes données par hasard?
    Car souvent ce genre d'erreur est assez redondant avec ce cas de figure.
    Solution au problème de formatage côté serveur pour PHP
    Bien préciser coté serveur l'encodage :

    1 - Il faut aussi flusher et vider le cache pour les problème de BOM.
    php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    flush();
    ob_start(); //starting output buffer
    php
    2 - xml
    petite function pour rendre clean le formatage xml des datas
    php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function clean_string_for_valid_xml($string) {
        $entities_array = array();
        foreach (get_html_translation_table(HTML_ENTITIES, ENT_QUOTES) as $character => $entity) {
            $entities_array[$entity] = '&#' . ord($character) . ';';
        }
        return str_replace(array_keys($entities_array), $entities_array, $string);
    }
    3 - charset à UTF-8 content-type text/xml pour le header
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mb_convert_encoding(clean_string_for_valid_xml($out), "UTF-8"); //converting output 
    header("Content-type: text/xml; charset=UTF-8");
    Si cela à déjà été fait ne tiens pas compte de mes remarques.

    Bonne chance
    Remarque très intéressante.
    Mais mon script PHP lancé en asynchrone ne génère pas encore l'XML. Cela passe par un fichier temporaire que je charge par la suite.
    Actuellement ,je soupçonne Doctrine que j'utilise pour récupérer mes données, de provoquer le blocage.

  14. #14
    Invité
    Invité(e)
    Par défaut
    script PHP lancé en asynchrone
    faux.

  15. #15
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Salut psclcnrd tu dit :
    C'est une procédure déjà utilisée, via une action sur un bouton, mais pas au démarrage de la page.
    Donc elle marche au click sur le bouton?
    Alors pourquoi ne pas stimuler le 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
     
    function stimuleMonBouton(){
                  document.getElementById("idform").onsubmit=function(){
                       return true;
                  };
    };
    ou
    function stimuleMonBouton(){
                  document.getElementById("idbouton").submit();
    };
    ou 
    function stimuleMonBouton(){
            $("#idbouton").trigger('submit');
    };
    ou
    function stimuleMonBouton(){
            $("#idform").trigger('onsubmit');
    };
    J'ai mit onsubmit(); pour la (form) envoye d'office ou sinon tu doit submit (bouton), et tout ceci dans ton window.onload ou dans ton cas jquery

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $(document).ready(function() {
    };
    mais je préfère plutôt cette méthode de chargement (jquery)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $(function(){
      stimuleMonBouton();
    });
    Je sais pas si ta déjà essayé a voir, sinon oubli ce que j'ai dit.
    Pour doctrine je te conseil de le désactiver quand tu débug sur du js, tests unitaires PHP ça pourrait être éventuellement une cause , moi au tout cas je désactive doctrine, et j'ouvre le bon firebug.
    Bon courage.

  16. #16
    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 Pascal,
    Citation Envoyé par psclcnrd Voir le message
    j'ai été contraint de remplacer les $.get par des $.ajax, car pour une raison mystérieuse, elle ne lançait pas le script php.
    Il y a peut-être un lien. Que se passait-il exactement ? Avais-tu une erreur côté serveur, côté client ou sur le réseau ? Vérifie les en-têtes HTTP dans chacune des requêtes AJAX, et assure-toi notamment qu'elles utilisent les mêmes cookies.

    Au fait, quelle est ta version de jQuery ? Sous quel(s) navigateur(s) tu testes tes scripts ?

Discussions similaires

  1. procédure attente
    Par Mau dans le forum Réseau
    Réponses: 7
    Dernier message: 26/09/2003, 22h23
  2. Délai d'attente expiré
    Par amiral thrawn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/04/2003, 12h04
  3. recupèrer file d'attente d'impression
    Par magic corp. dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2002, 14h12
  4. [Choix] Quelles attentes par rapport aux SGBD ?
    Par thierry34 dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 13/07/2002, 20h08

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