我可以从该函数外部停止执行函数吗?

时间:2015-03-12 20:43:42

标签: javascript

我有这段代码:

function toStop(){
  while(true){}
}
toStop();

现在,我怎么能阻止这个?或者,如果此函数调用位于setInterval正在运行的线程中的某个位置,我该如何终止当前线程?例如:

var id = setInterval(function(){
  toStop();
}, 1000);

//stop thread/timer with id here.

clearInterval无效,因为它等待函数调用结束。

谢谢!

3 个答案:

答案 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);,那么其他任何东西都无法执行。

setTimeoutsetInterval中调用这样一段代码会产生相同的结果,因为这些代码的回调也会在我们拥有的唯一线程中执行。

但是,您可以使用setIntervalsetTimeout创建定时重复执行,可以停止执行。

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);

注意:

  • 4SPEC中指定的最低时间间隔。
  • 如果回调执行的时间超过指定的时间间隔,
  • 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的不透明度。一直持续到鼠标光标移出并位于页面其他位置上。

这里是示例:https://codepen.io/Mau-Di-Bert/pen/VqrRxE