2017-08-15 104 views
0

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

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

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

谢谢!

+3

不......听起来像你试图解决问题的错误的方式。你为什么要暂停循环? – tymeJV

+0

你可以看看承诺,得到解决,然后在循环内开始等待这个承诺,当我== 7:https://developers.google.com/web/fundamentals/getting-started/primers/promises – Dimitri

+0

@tymeJV我' m制作Simon Game,我不想让我的循环继续,直到用户点击某些按钮。 – stephenpassero

回答

6

JavaScript是一个基于事件的单线程模型。如果您暂停执行,则无法在此期间评估您的旗帜。

相反,您应该退出循环,捕获更改标志的事件,并在您离开它的位置回到循环。

例如:

var flag = false; 
 
for (var i = 0; i < 15; i++) { 
 
    console.log(i); 
 
    // the following makes no sense, it is just an example 
 
    if (i === 7) { 
 
    break; 
 
    } 
 
} 
 

 
document.getElementById('my_button').onclick = function(e) { 
 
    i++; 
 
    for (i; i < 15; i++) { 
 
    console.log(i); 
 
    // it starts where you left it 
 
    } 
 
}
<div id="my_button">Click me!</div>

+0

好的...我会试试。 – stephenpassero

+0

有没有办法重新进入循环,而没有为同一个变量创建一个新的循环? – stephenpassero

+0

你为什么想这样做?使用相同的变量是IMO的最佳选择。 – David

0

编号A循环将执行,直到条件为真。

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; }

+0

OP表示,直到变量为真,如何10000毫秒,直到?说实话,他应该使用Observable模式。让循环运行到第7次迭代,观察将标志设置为真的事件,然后从第8次起继续迭代 –

0

试试这个

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

这将作出一个无限循环,但我想你知道如何&,其中标志将是真实的,可能是语法是不正确的,但我给你的想法是如何暂停一个循环...

0

ES6有一些东西叫做发电机,可能对你有所帮助。这不是for循环,但可以“暂停”你的脚本。 在这里阅读更多: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); 
 
    } 
 
}