从forTime内的setTimeout返回值

问题描述

如何在执行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的值。