javascript - chrome违规:[Violation] Handler花了83ms的运行时间

Fre*_*hna 51 javascript google-chrome facebook-javascript-sdk

我正在尝试在我的项目中实现Facebook的注销功能.登录工作正常.但我正面临着使用注销代码在JavaScript控制台中获取以下消息.

[违规]长时间运行的JavaScript任务需要318ms session.php:51 1 sdk.js:135

[Violation]处理程序运行时间为83毫秒(允许50毫秒)

我试图寻找其他类似的线程,这些解决方案对我来说没有用.我尝试删除部分代码,看看哪个部分有问题.很明显,由于Facebook的JS SDK导致错误,如消息中所示.我还停用了所有Chrome扩展程序.

代码在Firefox中运行良好,在Chrome和Opera中都不行.我有什么方法可以延长这个超时时间吗?或者在chrome中解决此问题的任何其他方法.这是我的注销代码.

<?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>
Run Code Online (Sandbox Code Playgroud)

出于显而易见的原因,我已从代码中删除了App-Id.任何帮助表示赞赏.:)

mah*_*off 98

"Chrome违规行为"不代表Chrome错误或应用错误.它们是警告,旨在帮助您改进脚本.在这里,Chrome正在提醒您,可能有机会加快您的脚本速度.

("冲突"可以说是误导性的术语,它真正的意思是,脚本违反预先定义的指导方针,这些消息在Chrome最早出现在2017年年初和最好有一个"更多信息"的提示阐述的意义和给.建议开发人员采取行动.希望将来可以添加这些操作.)


Dáv*_*író 22

这个警告:[Violation] 'setTimeout' handler took 126ms正如它所说的那样,您有一个处理程序,该处理程序主要由同步调用构建而成,并且您的计算机花了126 毫秒来处理它。

由于 JavaScript 不是多线程的,并且每个同步任务都会阻塞 UI,因此100 毫秒的同步任务非常引人注目。(60FPS16 毫秒

因此,您必须认真对待此警告,因为这意味着您的 UI 滞后。

为了解决这个问题,你必须将有问题的任务拆分成多个小任务。您可以通过启动异步作业来完成此操作,因为每个异步作业都会到达队列末尾,因此它们将在稍后处理,为 UI 留下计算空间。

  • 这应该是公认的答案。准确解释此警告的原因和严重性,并解释如何解决它。谢谢你! (6认同)

Ray*_*oss 19

由于没有人回答如何让它消失......事实证明,如果您的处理程序是带有等待方法的异步函数,它将抑制该消息。

const sleep = (s) =>
  new Promise((p) => setTimeout(p, (s * 1000) | 0))

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

setTimeout(timeoutHandler, 10000)
Run Code Online (Sandbox Code Playgroud)

如果你经常这样做......最好用专用的抑制器方法替换 sleep(1) 。我只是碰巧在我的实用程序中睡觉来调试竞争条件。

  • 长时间运行 JS 警告的目的是减少 UI 阻塞。通过使用“setTimeout()”使代码异步就是这样做的方法。网络请求和其他一些 API 本身也是异步的。 (3认同)

Man*_*ddy 10

这仅回答why we see this message.

通过default,Verbose 是off

详细已开启

Verbose设置为 时On,我们会看到此消息。

因此,除非您遇到严重的性能问题,否则我们可以将其恢复为默认设置Off,在这种情况下,我将不再看到该消息,也不会再妨碍我自己的日志消息。


Rez*_*eza 9

也许有点偏离主题,只是被告知,当您在异步函数中使用断点调试代码时,也可以看到此类消息,setTimeout如下所示:

[Violation] 'setTimeout' handler took 43129ms
Run Code Online (Sandbox Code Playgroud)

该数字(43129毫秒)取决于您在异步功能中停止的时间

  • 感谢这个评论,我能够找到这个主题并得到答案,无论是否偏离主题,它都非常有用。 (10认同)

Pra*_*ahu 6

似乎您已经找到了解决方案,但仍然可以在此页面上对其他人有所帮助

4.请注意“动画帧触发”事件右上角的红色三角形。每当您看到红色三角形时,都会警告您可能与此事件有关。

如果将鼠标悬停在这些三角形上,则可以看到这些是违规处理程序错误,并且按照第4点所述。是的,有一些与此事件相关的问题。