如何限制javascript中函数的执行时间?
Posted
技术标签:
【中文标题】如何限制javascript中函数的执行时间?【英文标题】:How to limit the execution time of a function in javascript? 【发布时间】:2013-01-12 21:56:55 【问题描述】:情况是:
用户编写了一些 js 代码,它应该在一些数据上运行(本地)。
但有时会有无限循环或递归调用......这就是为什么我需要限制函数的执行时间而不是编辑函数本身(即使是这样 - 我应该在每个序列点之后插入检查吗?但是呢?递归调用?)
对于这个奇怪的问题还有其他解决方案吗?也许 eval 可以给出一些代码的解析树或类似的东西?
【问题讨论】:
您是否更愿意尝试中止执行而不是简单地避免无限循环/递归? 当你说它在本地的一些数据上运行时,你的意思是在用户的机器上,还是在你控制的某个服务器上本地。如果是后者,这是否在类似 Node.js 的环境中运行? 原因是脚本执行的是用户的代码,而不是我的 «当您说它在本地的某些数据上运行时,您是指在用户的机器上运行,还是在您控制的某个服务器上本地运行。如果是后者,它是否在类似 Node.js 的环境中运行?»我的意思是在用户的机器上,但在浏览器中并使用 js 好吧,如果用户写了一些js,因为它无休止地循环,导致用户机器变慢,这不是最好的结果吗? IE。它将帮助用户意识到他们需要修复他们的代码。 【参考方案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
);
【讨论】:
以上是关于如何限制javascript中函数的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章
javascript 一个简单的队列,一次限制X同时异步函数执行。
我们如何在我们的 android 应用程序中执行一个 javascript 函数并获得一个返回值?