java脚本setTimeout和递归函数执行流程

时间:2017-09-29 16:02:08

标签: javascript settimeout

我有一个javascript函数如下。我想在setTimeout方法暂停执行。 setTimeout方法没有按预期工作,因为我理解超出setTimeout方法的执行传递,并且在100秒后调用console.log(" wait")。但这并不是我所期待的,我想要睡100秒。我将如何实现这一点,也可能是因为递归调用,console.log(" wait")只被调用一次,而不是所有的递归调用。为什么?

function matrixSearch(array,row1,row2,col1,col2,value)
    {
        console.log(array[row1][col1]);
        console.log(array[row2][col2]);
        if(value<array[row1][col1] || value > array[row2][col2])
            return false;
        if(value==array[row1][col1] || value == array[row2][col2])
            return true;
         var cRow1=row1,cCol1=col1,cRow2=row2,cCol2=col2;
         var midRow = Math.floor((row1+row2)/2);
         var midCol = Math.floor((col1+col2)/2);
         setTimeout(function() {
             console.log("wait");
         },100);
         while((row1!=midRow || col1!=midCol) && (row2!=midRow || col2!=midCol))
         {
            if(array[midRow][midCol]==value)
            {
                return true;
            }
            if (array[midRow][midCol]<value)
            {
                row2=midRow;
                col2=midCol;
            }
            else
            {
                row1=midRow;
                col1=midCol;
            }
            midRow = Math.floor((row1+row2)/2);
            midCol = Math.floor((col1+col2)/2);
         }
         var found = matrixSearch(array,midRow+1,cCol1,cRow2,midCol,value);
         if(!found)
             found=matrixSearch(array,cRow1,midCol+1,midRow,cCol2,value);
         return found;
    }

4 个答案:

答案 0 :(得分:2)

你需要把代码放在设定的时间内让它等待,但它有点棘手,因为你的回报不起作用

你可以对韭菜使用承诺。我还没有测试过这段代码,所以它可能无法工作,但这是你需要采取的方向

&#13;
&#13;
function matrixSearch(array,row1,row2,col1,col2,value)
    {
    return  new Promise(reslove,reject){
      setTimeout(function() {
        console.log(array[row1][col1]);
        console.log(array[row2][col2]);
        if(value<array[row1][col1] || value > array[row2][col2])
            return resolve(false);
        if(value==array[row1][col1] || value == array[row2][col2])
            return resolve(true);
         var cRow1=row1,cCol1=col1,cRow2=row2,cCol2=col2;
         var midRow = Math.floor((row1+row2)/2);
         var midCol = Math.floor((col1+col2)/2);
        
           while((row1!=midRow || col1!=midCol) && (row2!=midRow || col2!=midCol))
              {
                if(array[midRow][midCol]==value)
                {
                      return resolve(true);
                }
                if (array[midRow][midCol]<value)
                {
                    row2=midRow;
                    col2=midCol;
                }
                else
                {
                    row1=midRow;
                    col1=midCol;
                }
                midRow = Math.floor((row1+row2)/2);
                midCol = Math.floor((col1+col2)/2);
              }
              matrixSearch(array,midRow+1,cCol1,cRow2,midCol,value)
              .then(function(found) {
                if(found === false){
                   found = matrixSearch(array,cRow1,midCol+1,midRow,cCol2,value);
                  }
              })
             
         },100);
      
    }
&#13;
&#13;
&#13;

答案 1 :(得分:1)

setTimeout传递一个回调函数,该函数在给定时间后执行。后面的代码将紧跟在setTimeout行之后执行,而不是在指定的超时之后执行。

如果您希望在该时间段之后执行代码块,则需要将其放入回调函数中。

答案 2 :(得分:1)

setTimeout不是用于阻塞函数执行,它用于延迟执行传递给setTimeout函数的回调函数,用于延迟函数的其余部分,你必须把它放在现在放置console.log的地方

答案 3 :(得分:1)

首先,setTimeout使用毫秒,因此对于100秒的睡眠,您需要使用100000而不是100

其次,setTimeout是异步的,这意味着回调函数被安排在经过时间设置后执行,但其他代码仍然在此期间执行。

要做你想做的事,你需要一个虚拟变量和一个while-loop条件来测试这个变量的状态:

proceed=false;
setTimeout('proceed=true;',100000);
while (!proceed) {}
// rest of code

while循环将保留代码,直到执行setTimeout proceed=true;代码。