我有一个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;
}
答案 0 :(得分:2)
你需要把代码放在设定的时间内让它等待,但它有点棘手,因为你的回报不起作用
你可以对韭菜使用承诺。我还没有测试过这段代码,所以它可能无法工作,但这是你需要采取的方向
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;
答案 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;
代码。