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 :

Fonction ne marche qu'une seule fois


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut Fonction ne marche qu'une seule fois
    Bonjour !
    Mon site internet tourne depuis 12 ans mais cet été mon serveur a changé la version de php et mon code était désuet...
    Une partie du site ne fonctionnait plus et je pensais que c'était à cause des requêtes sql.
    Je reprend donc toutes les requêtes mysql en mysqli et en profite pour améliorer le site.
    Tout va bien mais là un simple appel à une fonction javascript me bloque.
    Voici un extrait épuré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // début du code
    function Appeler()
        {
        // ici je log "debut appeler"
        // instructions
       TimeA=setTimeout(function() { CheckAppeler(1); }, 2000);// 2 secondes       
        }
     
    function CheckAppeler(comptetour)
        {
        // instructions
        TimeB=setTimeout(function() { Appeler(); }, 2000);// 2 secondes    
        }
    // fin du code
    Le résultat du log donne ceci :
    //début de l'extrait du log
    2018/09/01 17:18:19 debut appeler
    2018/09/01 17:18:23 debut appeler
    2018/09/01 17:18:27 debut appeler
    2018/09/01 17:18:31 debut appeler
    à l'infini....
    // fin de l'extrait du log
    Tout va bien, un appel a la fonction Appeler aux 4 secondes.
    J'obtiens ce résultat avec Firefox, Chrome et Edge en mode local .

    Par contre si j'exécute sur internet, j'obtiens:
    //début de l'extrait du log
    2018/09/01 17:18:19 debut appeler
    // fin de l'extrait du log
    Rien d'autre. On dirait que l'appel a une fonction ne peut se faire qu'une fois (:

    Je commence à me demander si ce n'était pas cela qui bloquait le fonctionnement du site...
    J'ai php version5.5.8 en mode local et 5.6.37 sur mon serveur net.
    j'obtiens le même résultat sur le net avec Firefox, chrome et edge.

    Merci de me guider, Jean

  2. #2
    Membre éprouvé
    Homme Profil pro
    developpeur web et android
    Inscrit en
    Octobre 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur web et android
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2014
    Messages : 64
    Par défaut
    y pas d'erreur dans le second résultat. dans "CheckAppeler" tu as appelé "Appeler" qui s’exécutera 2secondes après.
    Voici comment ça va fonctionner ton code :

    - l'appel de la function "CheckAppeler" va déclencher l'appel de la function"Appeler" deux seconde après (jusque la y aura pas de message log)
    - lorsque la function "Appeler" va commencer par exécuté, elle va s'exécuté une fois s'arrêté


    si tu veux que ça s'exécute a l'infinit chaque 2secondes utilise :
    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
     
    // début du code
    function Appeler()
        {
        // ici je log "debut appeler"
        // instructions
       TimeA=setInterval(function() { CheckAppeler(1); }, 2000);// 2 secondes       
        }
     
    function CheckAppeler(comptetour)
        {
        // instructions
        TimeB=setTimeout(function() { Appeler(); }, 2000);// 2 secondes    
        }
    // fin du code

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut problème toujours le même
    Merci,
    Je connais setInterval mais ce n'est pas la solution. Les lignes de codes dont je vous ai fais grâce contiennent des appels xhr , dont le retour prend parfois quelques millisecondes et parfois plusieurs secondes. C'est pourquoi CheckAppeler est appelé avec un compteur et il tourne sur lui meme , quand la réponses xhr arrive, il effectue des commandes javascript puis rappelle la fonction Appeler juste quand il a fini, en fait 2 secondes après avoir fini. Ca peut parfois prendre 5 ou 20 secondes donc set interval appellerai CheckAppeler trop vite ou trop souvent.

    J'ai quand même essayé setInterval et le résultat est exactement pareil: en local ça fonctionne mais pas sur le net.
    Pour moi c'est du mystère.

  4. #4
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Par défaut
    Déjà, tu n'utilise pas la bonne syntaxe pour utiliser cette instruction =
    var identifiant = setTimeout( fonction[, delai, param1, param2, ...]);
    ce qui pour ton exemple de code s'écrit :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Appeler()
        {
        // ici je log "debut appeler"
        // instructions
       TimeA = setTimeout( CheckAppeler , 2000, 1);// 2 secondes       
        }
     
    function CheckAppeler(comptetour)
        {
        // instructions
        TimeB = setTimeout( Appeler, 2000);// 2 secondes    
        }

    Faut aussi savoir que les durée des délai (ici tes 2 secondes) sont rarement respectés par les interpréteurs JavaScript, et c'est d'ailleurs pour cette raison que la méthode delay en JQuery fait une vérification avec l'horloge interne et se relance quand le temps déroulé est plus court.

    Citation Envoyé par Jean Nadon Voir le message
    Les lignes de codes dont je vous ai fais grâce contiennent des appels xhr , dont le retour prend parfois quelques millisecondes et parfois plusieurs secondes.
    Il faut utiliser les promesses, ou jouer sur les callBack de tes appels Ajax (et en ESJ il y a maintenant les fetch, mais ça n'empeche pas qu'il faut quand même utiliser les promesses
    l'utilisation de setTimeOut ou SetInterval, sont à proscrire

    https://developer.mozilla.org/fr/doc..._les_promesses

    https://developer.mozilla.org/fr/docs/Web/API/Fetch_API

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2018
    Messages : 6
    Par défaut Plus de détail sur le pourquoi de mes appels à Appeler()
    Merci pour votre aide,
    J'utilise normalement la syntaxe de psychédélic mais en creusant mon problème , j'ai lu que l'autre façon était LA bonne ...
    De toute façon lors de mes tests les 2 façons de faire donnent la même réponse.
    Donc pourquoi ces appels en boucle? Depuis 12 ans , mon site offre un jeu de carte . 4 clients affichent la table de jeu avec leur 13 cartes.
    Chaque deux secondes, un appel xhr vérifie la base de donnée, si aucun changement, on re-appel dans 2 secondes. S'il y a un changement (carte de jouée par un autre joueur par exemple) la réponse du xhr met a jour le déplacement des cartes , qui peut jouer etc. Quand la table est prête , on ré-appel dans 2 secondes.
    Avec 4 joueurs aux 2 secondes , une partie qui dure 20 minutes et 10835 rencontres de plusieurs parties ça fait 100 millions de fois que ça fonctionne.
    Je veux bien améliorer mon code pour suivre les nouvelles technologies mais quand ça marche en mode local et que les mêmes scripts ne fonctionne pas sur internet je ne sais pas quoi faire.
    PS J'ai écrit à mon hébergeur web...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu dis que ces fonctions font appel à Ajax.

    Il est fort possible que ce soit un script PHP (appelé par Ajax) qui foire.


    Passe en version 5.6 en local.
    Tu verras bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Fonction qui ne marche qu'une seule fois
    Par haydens dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/07/2012, 10h04
  2. DataGrid drag & drop qui ne marche qu'une seule fois
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 19/06/2009, 09h24
  3. breakpoints, step into ne marche qu'une seule fois..
    Par Brzhk dans le forum Eclipse C & C++
    Réponses: 0
    Dernier message: 11/06/2009, 16h15
  4. [XL-2003] fonction mscomm1.input utilisable une seule fois?
    Par Elfstat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2009, 13h02
  5. KeyDown sur form ne marche qu'une seule fois
    Par Mariquiqui dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/01/2009, 19h47

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