我有一个无限期运行的循环,直到我告诉它停止。我实际上正在使用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;
}
但有没有办法实现这个目标?
答案 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;
}