退出父函数的函数

时间:2015-03-21 07:43:57

标签: javascript

我有一个无限期运行的循环,直到我告诉它停止。我实际上正在使用requestAnimationFrame,还有更多内容正在进行中,但下面的示例只是为了简化我的问题。

var _stop = false;

var loop = function () {
    while (!_stop) {
        if (some condition is met) {
            stop();
        }

        /* Do something. */

        loop();
    }
};

function stop() {
    _stop = true;
}

现在这一切都运行良好,但在实际停止之前它仍会再次运行/* Do something */。我希望它立即停止并返回。 当然,这可以这样做:

if (some condition is met) {
    stop();
    return;
}

但有没有办法将return部分加入stop();?由于显而易见的原因,这不符合我的要求:

function stop() {
    _stop = true;
    return;
}

但有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:1)

var _stop = false;
try {
  var loop = function () {
      if(!_stop) {
          if (some condition is met) {
              stop();
          }

          /* Do something. */

          loop();
      }
  };
} catch(e) {

}
function stop() {
    _stop = true;
    throw new Error("USE IT WITH PRECAUTION");
}

上面的循环是你退出整个循环的工作,但是我会说它的做法非常错误,理想的功能应该是

1)改变状态变量

2)或应该计算值。

3)或者应该确定错误状态以进一步停止执行

对于函数调用者的控制流是如何以及如何停止函数调用者执行流程,应该永远不会感到困扰。

答案 1 :(得分:0)

听起来你想在每次工作完成后检查条件(之前)。要使用_stop变量执行此操作(而不是简单地检查while条件本身中的条件),您必须:

  • 在开始循环之前根据条件设置变量
  • 做你的工作
  • 根据下一次循环迭代之前的条件设置变量

无论使用while()循环还是do while()循环完成此操作,过程都是相同的。在示例中添加预循环检查将阻止在用户退出时完成工作:

var _stop = false;

// Call loop() when required

var loop = function () {

    // Check condition before first iteration
    if (/* some condition is met */) {
        stop();
    }

    while (!_stop) {

        /* Do your work */

        // Check condition before every subsequent iteration
        if (/* some condition is met */) {
            stop();
        }

    loop();

    }
};

function stop() {
    _stop = true;
}

有没有理由你递归调用loop()而不是一次调用它并在包含的循环中完成所有工作直到用户退出?这个更简化的版本可能适合您:

var _stop = false; // Set it initially, could also use checkStopRequired() here

// Call loop() when required

var loop = function () {

    // Check condition before first iteration
    _stop = checkStopRequired();

    while (!_stop) {

        // Do your work, setting _stop to true if work returns early
        _stop = !doMyWork();

        // Check condition before every subsequent iteration
        _stop = checkStopRequired();

    }
};

function checkStopRequired() {
    // Return true if should stop, false if should continue
}

当执行每次循环迭代所需的工作时,您可能希望在任何昂贵的操作之前检查退出条件,以便在满足退出条件时允许整个操作停止,而不是等待工作完成。这显然取决于你正在做什么工作以及退出条件是什么。

在循环中调用的函数示例,如果在中途遇到停止条件,它将帮助您设置_stop:

function doMyWork() {
    // Get user input here...

    if (checkStopRequired()) { return false; }

    // Get data here...

    if (checkStopRequired()) { return false; }

    // Do logic here...

    if (checkStopRequired()) { return false; }

    // Render objects here...

    // Return successful result
    return true;

}

答案 2 :(得分:-1)

这可能不是最佳方式,但这可以这样做:

var _stop = false;
var flag=0;
var loop = function () {
    if(!_stop) {
        if(flag){
           return;
        }
        if (some condition is met) {
            stop();
            _stop = true;
            loop();
        }

        /* Do something. */

        loop();
    }
};

function stop() {
    //_stop = true;
    toReturn();
}

function toReturn(){
    flag=1;
}