【问题标题】:How to limit the execution time of a function in javascript?如何限制javascript中函数的执行时间?
【发布时间】:2013-01-12 21:56:55
【问题描述】:

情况是:

用户编写了一些 js 代码,它应该在一些数据上运行(本地)。

但有时会有无限循环或递归调用......这就是为什么我需要限制函数的执行时间而不是编辑函数本身(即使是这样 - 我应该在每个序列点之后插入检查吗?但是呢?递归调用?)

对于这个奇怪的问题还有其他解决方案吗?也许 eval 可以给出一些代码的解析树或类似的东西?

【问题讨论】:

  • 您是否更愿意尝试中止执行而不是简单地避免无限循环/递归?
  • 当你说它在本地的一些数据上运行时,你的意思是在用户的机器上,还是在你控制的某个服务器上本地。如果是后者,这是否在类似 Node.js 的环境中运行?
  • 原因是脚本执行的是用户的代码,而不是我的
  • «当您说它在本地的某些数据上运行时,您是指在用户的机器上运行,还是在您控制的某个服务器上本地运行。如果是后者,它是否在类似 Node.js 的环境中运行?»我的意思是在用户的机器上,但在浏览器中并使用 js
  • 好吧,如果用户写了一些js,因为它无休止地循环,导致用户机器变慢,这不是最好的结果吗? IE。它将帮助用户意识到他们需要修复他们的代码。

标签: javascript eval execution abort time-limiting


【解决方案1】:

一个可能的解决方案是使用Web Workers。 Web Worker 在单独的线程中启动并且可以终止。

var worker = new Worker('my_task.js');
...
worker.terminate();

缺点是not all browsers support Web Workers。

【讨论】:

  • Web Workers 也不能访问 DOM 元素。这可能是个问题,尤其是因为显然这是未知代码。
  • 注意:像往常一样,后台线程(包括工作线程)不能操作 DOM。如果后台线程采取的操作需要导致对 DOM 的更改,他们应该将消息发回给他们的创建者来完成这项工作。
【解决方案2】:

这是在浏览器中还是在节点中?

在浏览器中,您可以将代码放入 0 秒 setTimeout 以释放运行循环(并暂时解除对浏览器的阻塞)

setTimeout(function() {
   // your code here
}, 0)

node 有一些更漂亮的东西,看起来像这样并且稍微好一点:

process.nextTick(function() {
   // frees up the run loop even faster
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2018-04-23
    • 2011-08-29
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多