[英]Killing a JavaScript function which runs infinite
举个例子
var runInfinite = function(){
while(1)
{
// Do stuff;
}
};
setTimeout(runInfinite, 0);
是否有可能打破运行无限的runInfinite函数形式? 我的意思是可以在不使用flag或return语句的情况下从另一个函数中删除此函数吗?
答案是不。 由于JavaScript是单线程的(除非你使用一些不太常见的实现,我怀疑)没有什么可以从外部破坏循环(或任何其他代码块)。
没有直接的方法可以“杀死”正在运行的javascript函数。
可能的解决方法,虽然您需要替换while(1)
循环:
var i = 0; // for testing purposes
var toCall = "runInfinite()";
function runInfinite(){
// do stuff
console.log(i++);
setTimeout(function(){ eval(toCall); }, 100); // or whatever timeout you want
}
setTimeout(function(){ eval(toCall); }, 0); // start the function
setTimeout(function(){ toCall = ""; }, 5000); // "kill" the function
我知道使用eval()
被认为是不好的做法,但是这个想法应该是明确的。 该函数使用toCall
变量调用自身(不是递归的,因此是setTimeout()
)。 一旦取消设置此变量,就可以从外部删除它。
您可以将这些变量和函数包装在一个类中,这样就可以实现“kill”功能。
我刚刚在浏览器上测试过。
AFAIK,while(1)块将字面上阻止线程,不允许任何其他运行。 我没有经验以外的其他来源,但使用Chrome开发人员工具包的事情ctrl+shift+i
输入while(1){}
将阻止其他所有内容,因为browser-javascript是单线程的。
但是,如果您正在使用node.js
,则可能因为它具有多线程功能。 如果有人对node.js
足够熟悉并愿意回答/编辑,那就去吧。 我从未使用过它。
你想要的不是真的。 但也许你做错了。 尽量不要使用while(1)
如果可能,并且在函数结束时再次调用函数,如果外部标志被触发但是没有设置某个break按钮,或者如果否则返回
return可用于从当前执行中停止函数,但不能用于您的情况。
在你的情况下,你可以尝试将你的函数包装在try / catch块中 ,你可以在你的函数无限时找到它,基于你可以终止它的当前执行。
我承认这不完全相同,但是, ECMA-262中有Javascript生成器和Javascript迭代器。 如果您可以使用生成器功能替换您的功能,则可以轻松实现易碎功能。
function execWithTimeout(iter, timeout = 100) { const limit = Date.now() + timeout for (const output of iter) { console.log(output) if (Date.now() > limit) throw(new Error("Timeout reached")) } } let runInfinite = function * () { let i = 0 while (1) { yield i++ } } execWithTimeout(runInfinite())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.