我有这段代码:
function toStop(){
while(true){}
}
toStop();
现在,我怎么能阻止这个?或者,如果此函数调用位于setInterval
正在运行的线程中的某个位置,我该如何终止当前线程?例如:
var id = setInterval(function(){
toStop();
}, 1000);
//stop thread/timer with id here.
clearInterval
无效,因为它等待函数调用结束。
谢谢!
答案 0 :(得分:1)
而不是无限循环,只需使用if语句并将其包装在一个区间中:
var shouldContinue = true;
var interval = 0;
function toStop() {
if (interval == 0) {
interval = setInterval(function() {
if(shouldContinue) {
...
}
else {
clearInterval(interval);
interval = 0;
}
}, 200); // Or whatever interval makes sense
}
}
toStop();
// ...
shouldContinue = false;
在行动here中查看此原则。
答案 1 :(得分:0)
"我可以从该功能外部停止执行某个功能吗?"
否,您无法以编程方式进行操作。
JavaScript是单线程的,如果你运行一段使其无限繁忙的代码,例如while(true);
,那么其他任何东西都无法执行。
在setTimeout
或setInterval
中调用这样一段代码会产生相同的结果,因为这些代码的回调也会在我们拥有的唯一线程中执行。
但是,您可以使用setInterval
或setTimeout
创建定时重复执行,可以停止执行。
var timerId = setInterval(function () {
//Process an iteration of the loop in here
//If you cause an infinite loop in here, you will have the same issue
}, 50);
//stop the timer after ~3 seconds
setTimeout(clearInterval.bind(null, timerId), 3000);
注意:
4
是SPEC中指定的最低时间间隔。setInterval
将堆叠。出于这个原因,我从不使用setInterval
并始终使用setTimeout
。 e.g。与setTimeout
var stopProcessing = startProcessing();
//Stop processing after ~3 seconds
setTimeout(stopProcessing, 3000);
function startProcessing() {
var timerId;
!function process() {
//Do some processing
//Continue processing in ~50 ms
timerId = setTimeout(process, 50);
}();
return function () { clearTimeout(timerId); }
}
答案 2 :(得分:0)
否,您无法以编程方式进行操作,如@plalx所说的 ,但您可以尝试以下操作 :在外部声明绑定并进行检查继续或停止循环:
let letMeGoOut;
function toStop(){
while(letMeGoOut != false)
}
toStop();
在这里,我在mouseover
上创建了一个函数,该函数触发了一个循环,更改了h1
的不透明度。一直持续到鼠标光标移出并位于页面其他位置上。