【问题标题】:Handle infinite loop in third party javascript file (c# .net)处理第三方javascript文件中的无限循环(c#.net)
【发布时间】:2013-07-23 10:06:41
【问题描述】:

我需要加载第三方脚本文件(我没有任何控制权),但我想避免挂起页面,以防脚本中有无限循环。 我尝试调用 javascript 文件并将其放入更新面板中,只需单击一个按钮,但页面仍然挂起。我什至尝试将它放在 iframe 中,只是为了将它与其他控件分开,结果发生了同样的情况。

是否真的没有办法在无限循环开始执行后停止它?

【问题讨论】:

  • ..除非调试器有它的控制点,否则不会。为什么不启动调试器并单步调试它以找出它进入无限循环的原因?当你在那里时,你可以修补它并提交修复:)
  • @SimonWhitehead,目前第三方 js 文件已修复,不再有无限循环,但无论如何我希望能够处理问题。因为它已经发生过一次,我想避免再次遇到同样的问题。有办法吗?
  • @Sayse 我认为还有。我不能因为我正在使用的第三方 js 文件而让我的页面在未来崩溃。如果可能的话,我的页面必须是独立的。

标签: c# javascript .net infinite-loop freeze


【解决方案1】:

您正在尝试为已修复的错误添加处理,因此将会发生的只是您的代码将不必要地变得更加复杂。

我相信他们提供的修复程序,您可以考虑添加 Unit Tests,这将使您能够以安全的方式测试错误

编辑 如果您认为该错误仍然存​​在,那么您可以创建一个小型测试示例(即您的单元测试)发送给第三方,希望得到更好的修复

【讨论】:

  • 是的,第三方 js 文件现在可以正常工作了。为了测试我是否可以处理 js 文件中的无限循环,我用我自己的具有无限循环的 js 文件替换了第三方 js 文件(即 while(true);)
  • 对不起,我不明白您要做什么,我的建议是您可以添加一个使用第三方文件的测试以确保它不会崩溃跨度>
  • 我需要在每次页面加载时对其进行测试。现在不测试代码。因为就像我说过的,我对 js 文件没有任何控制权。他们可以随时改变它。所以现在进行单元测试是不够的。
  • 有了正确的单元测试就足够了,我回答的目的是为我现有的 cmets 提供更多详细信息,这超出了我认为的另一条评论
  • 你对我将如何进行单元测试有什么建议吗?谢谢
【解决方案2】:

使用debugger; 调试脚本文件。将 debugger; 符号放在脚本方法的开头,该方法将在 chrome 中执行和运行(因为它很容易调试)。单击 F12 打开调试器工具。脚本执行将在您输入debugger; 的那一行停止并逐行调试。

如果脚本正在执行无限循环,则 chrome 选项卡将崩溃并显示消息 “Aw, Snap!”。您可以参考调用堆栈来查找导致问题的方法。

【讨论】:

  • 我不想知道问题出在哪里。无论其原因如何,我都希望能够处理 js 文件中发生的无限循环。我需要避免我的页面挂起。
  • @jbdeguzman 可能是throw "";将完成这项工作。 setTimeOut(function(){ throw ""; },delay); 将避免页面挂起并停止脚本执行。
  • 脚本无限循环时,页面挂起。当页面挂起时,它不会再做任何事情了。即使 setTimeout 的延迟已经过去,带有 throw 的函数也不会被执行。
【解决方案3】:

可能的解决方案可能是使用Web Worker 并在其中运行您的 JS 代码。过了一会儿,如果它没有任何回应,请致电worker.terminate() 以“杀死”它。

请注意,Web Worker 有很大的限制:例如,您不能从运行在 Web Worker 范围内的代码中访问 UI 元素,并且旧浏览器不支持。

我不知道 web worker 是否适合您的情况,但这是一个可能提供帮助的选项。

【讨论】:

  • 我会试试这个。希望这是我需要的。 tnx!
  • @jbdeguzman:抱歉,我的回答中有错字:您无法从运行在 webworker 上的 JS 代码访问 UI 元素。如果这仍然适合您的情况,请继续尝试是否可以解决您的问题。
  • 我觉得还是合适的。我所需要的只是测试 js 文件是否运行良好而不影响我的页面并且仍然允许我使用控件。如果是这样,我会在我的页面上运行它。如果没有,我将忽略该文件。我现在就试试。
  • w=new Worker(“demo_workers.js”); -->这部分不适用于我的 Chrome 版本。我不知道为什么。如果是 IE 我会理解的。
  • 我有最新版本的 Chrome(版本 28.0.1500.72)。根据该消息来源,它适用于任何版本的 chrome。我刚刚从w3schools.com/html/html5_webworkers.asp 复制了代码,但我不知道为什么它仍然无法在 chrome 中运行。仅在 Mozilla 和 Safari 中。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 2012-04-07
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多