有没有办法暂停for循环,直到变量为真?例如,如果我有这个代码,
var flag = false;
for(var i = 0; i < 15; i++){
console.log(i);
}
且i
等于7,我可以暂停循环直到flag = true
吗?
谢谢!
答案 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);
}
}
实际上,您可以在一个函数中隔离所有逻辑来管理循环和用户事件,递归地为用户事件创建处理程序以调用自身。它还有一个优点,你可以根据需要多次停止循环。
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;
答案 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
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;