如何在javascript中限制函数的执行时间?

如何在javascript中限制函数的执行时间?,javascript,eval,execution,abort,time-limiting,Javascript,Eval,Execution,Abort,Time Limiting,情况是: 用户编写一些js代码,应该在一些数据上运行(本地) 但有时会有无止境的循环或递归调用……这就是为什么我需要限制函数的执行时间,而不是编辑函数本身(即使是这样,我应该在每个序列点之后插入检查吗?但是递归调用呢?) 这个奇怪的问题还有其他解决办法吗?也许eval可以给出一些代码的解析树或类似的东西?这是在浏览器中还是在节点中 在浏览器中,您可以将代码放入0秒setTimeout,以释放运行循环(并暂时取消浏览器的阻止) node有一些更奇特的东西,看起来像这样,稍微好一点: process

情况是:

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

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


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

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

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

node有一些更奇特的东西,看起来像这样,稍微好一点:

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

一个可能的解决方案是使用。web worker在单独的线程中启动,可以终止

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

缺点是网络工作者。

有什么原因让你更愿意尝试中止执行,而不是简单地避免无限循环/递归?当你说它在本地运行在某些数据上时,你是指在用户的机器上,还是在你控制的某个服务器上本地运行。如果是后者,这是在Node.js环境中运行的吗?原因是脚本执行用户的代码,而不是my«当您说它在本地的一些数据上运行时,是指在用户的机器上,还是在您控制的某些服务器上本地运行。如果是后者,这是在Node.js环境中运行的吗?我的意思是在用户的机器上,但在浏览器和使用jsWell时,如果用户编写一些js使用户的机器慢下来,因为它无休止地循环,这不是最好的结果吗?也就是说,它将帮助用户认识到他们需要修复代码。此外,Web工作人员无法访问DOM元素。这可能是一个问题,特别是因为显然,这是未知代码。如果后台线程所采取的操作需要对DOM进行更改,那么他们应该将消息发回其创建者以完成该工作。
var worker = new Worker('my_task.js');
...
worker.terminate();