Chrome 违规:[Violation] 处理程序花费了 83 毫秒的运行时间

Posted

技术标签:

【中文标题】Chrome 违规:[Violation] 处理程序花费了 83 毫秒的运行时间【英文标题】:Chrome violation : [Violation] Handler took 83ms of runtime 【发布时间】:2017-07-02 07:16:13 【问题描述】:

我正在尝试在我的项目中实现 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>

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

【问题讨论】:

这只是一个警告,你不必关心它,你的代码仍然可以工作。 @NoNameProvided 但是注销功能在 Chrome 中不起作用。它无法重定向到 Chrome 中的 login.php 页面。 事件如果不起作用,则与违规消息无关。它们只是非正式的,对您的代码没有影响。 @NoNameProvided 那么代码为什么在 Firefox 中可以运行,而在 Chrome 中却不行呢?我检查了代码,它是正确的。你可以自己去看看。 好像是重复的:***.com/questions/41218507/… 【参考方案1】:

这只是一个警告,它通知存在延迟或等待继续使用代码 a(未来)。正如他们在上面的评论中所说,这可以由一个简单的警报触发,您可以通过将其放置在 JS 代码中间等待用户响应来对其进行测试。

例如,如果您发出警报(“我等你”),您会看到您给出的速度越快,它会减少警告“[Violation]'change' handler took 1496ms”中的时间。

在您的情况下,这是因为您有一个连接检查“(response.status === 'connected')”这应该等待连接响应。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

要知道这种消息在你使用的时候也可以看到

alert("bla bla");

这件事发生在我身上,所以我与你分享。

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案3】:

我意识到我可以忽略这种违规行为。但是,当我尝试 Ray Foss 的答案时,违规行为消失了!

我借用了他的 sleep 函数,然后添加了“await sleep(1)”作为导致违规消息的函数的第一行。代码仍然运行良好,并且控制台中不再显示违规消息!

我不得不对 Ray 的例子做一点改动。被声明为异步函数的函数仍然需要“function”关键字。

因此,在 Ray 的示例中,“async timeoutHandler()”应该是“async function timeoutHandler()”。一旦我进行了更改,代码运行良好。

注意:从技术上讲,由于调用了 sleep(1) 函数,我的函数现在慢了一点。但是,这并不明显,而且在我看来,让违规消息消失的开销是值得的。

【讨论】:

这不是答案,更适合作为对您所指帖子的评论。 我还没有评论帖子的声誉。但是,我想说明需要稍作调整才能让其他用户的答案正常工作。我同意这将更适合作为评论,并且一旦我值得,将来会这样做。【参考方案4】:

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

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


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


setTimeout(timeoutHandler, 10000)

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

【讨论】:

长时间运行 JS 警告的目的是减少 UI 阻塞。使用setTimeout() 使您的代码异步是您的方法。网络请求和其他一些 API 本身也是异步的。【参考方案5】:

您似乎已经找到了解决方案,但它仍然会对其他人有所帮助,在基于 Chrome 59 的this page 上。

4.注意Animation Frame Fired 事件右上角的红色三角形。每当你看到一个红色三角形时,它就是一个警告,可能有 是与此事件相关的问题。

如果您将鼠标悬停在这些三角形上,您可以看到这些是违规处理程序错误,根据第 4 点。是的,存在与该事件相关的一些问题。

【讨论】:

【参考方案6】:

“Chrome 违规”不代表 Chrome 或您自己的网络应用程序中的错误。相反,它们是帮助您改进应用程序的警告。在这种情况下,Long running JavaScripttook 83ms of runtime 会提醒您可能有机会加速您的脚本。

(“违规”不是最好的术语;这里使用它来暗示脚本“违反”预定义的准则,但“警告”或类似内容会更清楚。这些消息于 2017 年初首次出现在 Chrome 中,应该最好有一个“更多信息”提示来详细说明含义并向开发人员提供建议的操作。希望将来会添加这些内容。)

【讨论】:

【参考方案7】:

也许有点离题,请注意,当您使用异步函数(如 setTimeout)内的断点调试代码时,也会看到此类消息,如下所示:

[Violation] 'setTimeout' handler took 43129ms

该数字 (43129ms) 取决于您在异步函数中停止的时间

【讨论】:

多亏了这条评论,我才能找到这个话题并得到答案,不管是否离题,这非常有用。 我在使用 webpack-dev-server 时遇到了这个警告,但这个问题只影响了开发环境。在生产版本中很好

以上是关于Chrome 违规:[Violation] 处理程序花费了 83 毫秒的运行时间的主要内容,如果未能解决你的问题,请参考以下文章

CoreData multithreading_violation 调试

在解决控制台中的 [Violation] 警告时滚动 DIV 时防止页面滚动

React-Native = Invariant Violation:超过最大更新深度

Invariant Violation:文本字符串必须在 Text 组件中呈现

Flash AS3 Security Sandbox Violation / s.ytimg.com

如何计算一个项目在mysql中给定日期出现的次数