问题描述
如何在执行setTimeout函数之前让循环等待,并且可以在使循环再次执行之前修改其i值?
代码:
function Delay(){
for (let i = headsPosition; i <= lineIndex.length-1; i++) {
(function(i){
setTimeout(() => {
if (Number.isInteger(lineIndex[i])) {
let parsing = parseInt(lineIndex[i]);
lineIndex[i] = parsing.toString();
}
for (let j = 1; j <= firstPosition.length; j++) {
if (currentState == firstPosition[j]){
if (lineIndex[i] == secondPosition[j]) {
lineIndex[i] = thirdPosition[j];
currentState = fifthPosition[j];
tape.innerHTML = lineIndex;
if (fourthPosition[j] === "L") {
i-=2;
}
break;
}
}
}
console.log(i)
},i*100);
})(i);
console.log(i)
}
}
startButton.onclick = function (){
Delay();
}
解决方法
您可以通过使用递归函数来实现:
function Delay() {
loop(headsPosition,lineIndex.length-1);
}
function loop(i,maxi) {
setTimeout(() => {
if (Number.isInteger(lineIndex[i])) {
let parsing = parseInt(lineIndex[i]);
lineIndex[i] = parsing.toString();
}
for (let j = 1; j <= firstPosition.length; j++) {
if (currentState == firstPosition[j]) {
if (lineIndex[i] == secondPosition[j]) {
lineIndex[i] = thirdPosition[j];
currentState = fifthPosition[j];
tape.innerHTML = lineIndex;
if (fourthPosition[j] === "L") {
i -= 2;
}
break;
}
}
}
console.log(i)
//this part is what makes it behave like a loop
if(i < maxi) {
loop(i + 1,maxi);
}
},i * 100);
}
startButton.onclick = function() {
Delay();
};
创建一个函数,而不是使用for
循环(它不会等待),直到结束时,它使用下一个值i
(直到给定值)调用自身限制)。这使您可以等待函数中的setTimeout
。它还允许您根据自己的条件来修改i
的值。