有没有办法暂停for循环,直到变量为真

时间:2017-08-15 21:01:42

标签: javascript

有没有办法暂停for循环,直到变量为真?例如,如果我有这个代码,

var flag = false; 
for(var i = 0; i < 15; i++){
    console.log(i);
}

i等于7,我可以暂停循环直到flag = true吗?

谢谢!

5 个答案:

答案 0 :(得分:6)

JavaScript是一个基于事件的单线程模型:如果你可以暂停执行,那么在那段时间你就无法评估你的旗帜。

此外,如果标志的值取决于用户事件,则您希望等待事件触发,而不是等待变量更改。

如果像你的例子中一样,事先知道你想要暂停循环,你应该将它拆分:

for(var i = 0; i <= 7; i++){
    console.log(i);
}

document.querySelector("button").onclick = function() {
  for(var i = 8; i < 15; i++){
      console.log(i);
  }
}

如果您不了解它(因为它是在for循环中决定的),您只需要确保下一次循环从它停止的点开始(例如,通过重用{ {1}}变量)。

i

如果循环中的代码很长,你可以将它包装在一个函数中(感谢@ tom ):

for (var i = 0; i < 15; i++) {
  console.log(i);
  if (Math.random() < 0.2) { break; }
}

document.querySelector("button").onclick = function() {
  for (i++; i < 15; i++) {
    console.log(i);
  }
}

实际上,您可以在一个函数中隔离所有逻辑来管理循环和用户事件,递归地为用户事件创建处理程序以调用自身。它还有一个优点,你可以根据需要多次停止循环。

&#13;
&#13;
function logIndex() {
  //some code
  console.log(i);
}
&#13;
var button = document.querySelector("button");

function logIndexes(index) {
  for (index; index < 15; index++) {
    console.log(index);
    if (Math.random() <= 0.2) {
      return button.onclick = function() {
        logIndexes(index + 1);
      }
    }
  }
  button.onclick = null;
}

logIndexes(0);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用间隔和超时来模拟循环和更改flag

function count(start, end, inc) {
    var i = start;
    return function () {
        if (i === 8 && ! flag) {
            return;        
        }
        console.log(i);
        i += inc;        
        if (i >= end) {
            clearInterval(interval);
        }
    }
}


var flag = false,
    interval = setInterval(count(0, 10, 1), 500);

setTimeout(function () {
    flag = true;
}, 10000);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

没有。循环将执行,直到条件为真。

答案 3 :(得分:0)

试试这个

var flag = false; 
for(var i = 0; i < 15; i++){ 
    If ((i > 6) && (! flag)){
        i = 6;
    } else {
         console.log(i); 
    }
}

这会产生一个无限循环,但我想你知道如何&amp;如果flag是真的,可能是语法不正确,但我给你如何暂停循环的想法......

答案 4 :(得分:0)

ES6有一些叫做生成器的东西,对你有帮助。它不是for循环,但可以&#34;暂停&#34;你的脚本。 在此处阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators

&#13;
&#13;
function* idMaker() {
  let index = 0;
  while (index < 15) {
    yield index++;
  }
}

var gen = idMaker();

//console.log(gen.next().value);
//console.log(gen.next().value);

for (i of gen) {
  if (gen.next().done) {
    console.log('all done');
  } else {
    console.log(i);
  }
}
&#13;
&#13;
&#13;