169 votes

Violation de Chrome : [Violation] Le gestionnaire a pris 83 ms de temps d'exécution.

J'essaie d'implémenter la fonctionnalité de déconnexion de Facebook dans mon projet. La connexion fonctionne très bien. Mais je suis confronté à l'obtention du message suivant dans la console JavaScript avec le code de déconnexion.

[Violation] Une tâche JavaScript longuement exécutée a pris 318 ms session.php:51 1 sdk.js:135

[Violation] Le gestionnaire a pris 83 ms de temps d'exécution (50 ms autorisés).

J'ai essayé de rechercher d'autres fils de discussion similaires, mais ces solutions n'ont pas fonctionné pour moi. J'ai essayé de supprimer des parties de mon code et de voir quelle partie pose problème. Il est clair que l'erreur est due au JS SDK de Facebook, comme le montre le message. J'ai également désactivé toutes mes extensions Chrome.

Le code fonctionne bien dans Firefox mais pas dans Chrome, ni dans Opera . Existe-t-il une méthode permettant d'allonger la durée de ce délai ? Ou toute autre méthode pour résoudre ce problème dans Chrome. Voici mon code pour la déconnexion.

<?php
    session_start();
    //echo $_SESSION["current_user"];
    //echo $_COOKIE["current_user"];
    session_destroy();
    unset($_COOKIE["current_user"]);
    setcookie("current_user","",time() -3600, "/","", 0);
    //header("location: login.php");
?>

<!doctype html>

<html>
<head>
</head>
<body>

<script>

    // Default settings
    window.fbAsyncInit = function() {
        FB.init({
            appId      : '<app-id>',
            cookie     : true,
            xfbml      : true,
            version    : 'v2.8'
        });
        FB.AppEvents.logPageView();   
    };

    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/sdk.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));

    window.onload = function(){
        logout();
    }
    function logout(){
        console.log("1");
        FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            FB.logout();
            console.log("2");
            window.location="login.php";
            console.log("3");
        }
        else{
            console.log("4");
            window.location="login.php";
            console.log("5");
        }
        });
    }
</script>
</body>
</html>

Pour des raisons évidentes, j'ai retiré l'App-Id du code. Toute aide est appréciée :)

4 votes

C'est juste un avertissement, vous n'avez pas à vous en soucier, votre code fonctionnera toujours.

1 votes

@NoNameProvided Mais la fonction de déconnexion ne fonctionne pas dans Chrome. Elle ne parvient pas à rediriger vers la page login.php dans Chrome.

6 votes

Si cela ne fonctionne pas, cela n'a rien à voir avec les messages de violation. Ils sont seulement informels, et n'ont aucun effet sur votre code.

298voto

mahemoff Points 4879

Les "violations de Chrome" ne représentent pas des erreurs dans Chrome ou dans votre propre application Web. Il s'agit plutôt d'avertissements destinés à vous aider à améliorer votre application. Dans ce cas, Long running JavaScript et took 83ms of runtime vous alertent qu'il y a probablement une opportunité d'accélérer votre script.

("Violation" n'est pas la meilleure terminologie ; elle est utilisée ici pour impliquer que le script "viole" une directive prédéfinie, mais "avertissement" ou similaire serait plus clair. Ces messages sont apparus pour la première fois dans Chrome au début de 2017 et devraient idéalement avoir une invite "Plus d'infos" pour élaborer la signification et donner des suggestions d'actions au développeur. Espérons que ces éléments seront ajoutés à l'avenir).

78voto

Reza Points 375

Peut-être un peu hors sujet, sachez que ce genre de messages peut également être vu lorsque vous déboguez votre code avec un point d'arrêt à l'intérieur d'une fonction asynchrone telle que setTimeout comme ci-dessous :

[Violation] 'setTimeout' handler took 43129ms

Ce nombre (43129ms) dépend de la durée d'arrêt de votre fonction asynchrone

23 votes

Grâce à ce commentaire, j'ai pu trouver ce sujet et obtenir une réponse, hors sujet ou non, c'était très utile.

0 votes

J'ai eu cet avertissement en utilisant webpack-dev-server mais le problème n'a affecté que l'environnement de développement. Il n'y avait aucun problème dans la version de production.

19voto

Ray Points 67

Comme personne n'a répondu comment le faire disparaître... Il s'avère que si votre gestionnaire est une fonction asynchrone avec une méthode await, il supprimera le message.

function sleep (ms) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

async timeoutHandler() {
  await sleep(1)
  ... // heavy duty code here
}

setTimeout(timeoutHandler, 10000)

Si vous faites cela souvent... il est probablement préférable de remplacer sleep(1) par une méthode de suppression dédiée. Il se trouve que j'ai sleep qui traîne dans mes utilitaires pour déboguer les conditions de course.

16voto

Il semble que vous ayez trouvé votre solution, mais elle sera quand même utile à d'autres, sur cette page sur le point basé sur Chrome 59.

Notez le triangle rouge en haut à droite de l'événement Animation Frame Fired. Chaque fois que vous voyez un triangle rouge, c'est un avertissement qu'il peut y avoir un problème lié à cet événement. un problème lié à cet événement.

Si vous survolez ces triangles, vous pouvez voir que ce sont les erreurs de traitement des violations et en ce qui concerne le point 4, oui il y a un problème lié à cet événement.

-11voto

La dernière mise à jour de Google Chrome a obtenu cette violation, je crois que c'est un bug dans Chrome, mais cela fonctionne bien dans Firefox..... Google Chrome a échoué dans la dernière mise à jour.

"La violation du gestionnaire de changement d'état a pris 760 ms après la mise à jour de la dernière version de Chrome

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X