代码执行中的同步延迟

我有一个代码,需要在延迟说5000毫秒后执行。目前我使用的是setTimeout但它是异步的,我希望执行等待它的返回。 我尝试过使用以下内容:

function pauseComp(ms) { var curr = new Date().getTime(); ms += curr; while (curr < ms) { curr = new Date().getTime(); } } 

但我想延迟的代码是使用raphaeljs绘制一些对象,并且显示器根本不是平滑的。 我正在尝试使用doTimeout插件。 我需要延迟一次,因为延迟和要延迟的代码都在一个循环中。 我没有要求id,所以我没有使用它。 例如:

 for(i; i<5; i++){ $.doTimeout(5000,function(){ alert('hi'); return false;}, true);} 

这等待5秒钟,然后给出第一个Hi,然后连续循环迭代在第一个之后立即显示警报。 我想要它做的是等待5秒再次提醒警报等待然后提供警报等等。

任何提示/建议表示赞赏!

接受的答案的变化与这个一样好。

此外,我同意更喜欢setTimeout和异步函数调用的注意事项,但有时例如,在构建测试时,您只需要一个同步等待命令…

 function wait(ms) { var start = Date.now(), now = start; while (now - start < ms) { now = Date.now(); } } 

如果你想要它在几秒钟内,在while检查时将开始ms除以1000 ...

JavaScript是一种单线程语言。 您无法组合setTimeout和同步处理。 会发生什么,计时器将会失效,但JS引擎将等待处理结果,直到当前脚本完成。

如果你想要同步方法,只需直接调用方法!

如果要在setTimeout之后处理某些内容,请将其包含在内或从超时函数中调用它。

非超时循环(检查时间或计数到1000000或其他)只是锁定浏览器。 setTimeout (或$.doTimeout插件)是最好的方法。

在循环中创建超时将不起作用,因为循环不会在继续之前等待先前的超时发生,正如您所发现的那样。 尝试更像这样的东西:

 // Generic function to execute a callback a given number // of times with a given delay between each execution function timeoutLoop(fn, reps, delay) { if (reps > 0) setTimeout(function() { fn(); timeoutLoop(fn, reps-1, delay); }, delay); } // pass your function as callback timeoutLoop(function() { alert("Hi"); }, 5, 5000); 

(我只是快速地将它拼凑在一起,所以尽管我确信它有效但它可以通过多种方式进行改进,例如,在“循环”中它可以将索引值传递给回调函数,以便您自己的代码知道哪个迭代它取决于。但希望它会让你开始。)

我做了一个简单的同步超时function。 它以两种不同的方式工作,回调和非回调。

function:

 function wait(ms, cb) { var waitDateOne = new Date(); while ((new Date()) - waitDateOne <= ms) { //Nothing } if (cb) { eval(cb); } } 

回调示例:

 wait(5000,"doSomething();"); 

非回调示例:

 console.log("Instant!"); wait(5000); console.log("5 second delay"); 

以下是如何使用JQuery doTimeout插件

 jQuery('selector').doTimeout( [ id, ] delay, callback [, arg ... ] ); 

从文档 :“ 如果回调返回true, doTimeout 循环将在延迟之后再次执行,创建一个轮询循环,直到回调返回非真值。

 var start = Date.now(); console.log("start: ", Date.now() - start); var i = 0; $.doTimeout('myLoop', 5000, function() { console.log(i+1, Date.now() - start); ++i; return i == 5 ? false : true; });