如何限制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同时异步函数执行。

JavaScript中定时调用函数 test()如何写

如何将python烧瓶函数的执行限制为单个实例

我们如何在我们的 android 应用程序中执行一个 javascript 函数并获得一个返回值?

如何使用 ChartJS 和 FreeMarker 执行 JavaScript 函数?

在 jQuery 中填充文本框时执行 javascript 函数?