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

ste*_*ero 1 javascript

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

var flag = false; 
for(var i = 0; i < 15; i++){
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Dav*_*vid 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你不知道它(因为它是在for循环中决定的)你只需要确保下一次循环在它停止的点开始时(例如,通过重用i变量).

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

function logIndex() {
  //some code
  console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)
<button>Click me!</button>
Run Code Online (Sandbox Code Playgroud)