Javascript – 等待5秒后再执行下一行

下面的这个函数不能像我想要的那样工作 – 作为一个JS新手我无法弄清楚为什么。

我需要等待5秒钟,然后检查newState是否为-1。

目前,它不等,它只是马上检查。

 function stateChange(newState) { setTimeout('', 5000); if(newState == -1) { alert('VIDEO HAS STOPPED'); } } 

你必须把你的代码放在你提供给setTimeout的callback函数中:

 function stateChange(newState) { setTimeout(function () { if (newState == -1) { alert('VIDEO HAS STOPPED'); } }, 5000); } 

任何其他代码将立即执行。

你真的不应该这样做,正确使用超时是OP的问题和任何其他场合,你只是想在一段时间后运行的东西正确的工具。 Joseph Silber已经certificate了他的回答。 但是,如果在一些非生产的情况下,你真的想挂一段时间的主线程,这将做到这一点。

 function wait(ms){ var start = new Date().getTime(); var end = start; while(end < start + ms) { end = new Date().getTime(); } } 

执行forms如下:

 console.log('before'); wait(7000); //7 seconds in milliseconds console.log('after'); 

我到达这里是因为我正在构build一个简单的testing用例,用于围绕长时间运行的阻塞操作(即昂贵的DOM操作)对asynchronous操作进行sorting,这是我的模拟阻塞操作。 它适合那个工作很好,所以我想我把它发布给任何其他谁来到这里与类似的用例。 即使如此,它也是在while循环中创build一个Date()对象,如果运行时间足够长,可能会压倒GC。 但我不能强调, 这只适合testing,build立任何实际的function,你应该参考约瑟夫西尔柏的答案。

你不应该试图在JavaScript中暂停5秒。 这种方式不行。 您可以安排一个代码函数,从现在开始运行5秒,但是您必须将稍后要运行的代码放入函数中,并且在该函数之后的其余代码将会继续立即运行。

例如:

 function stateChange(newState) { setTimeout(function(){ if(newState == -1){alert('VIDEO HAS STOPPED');} }, 5000); } 

但是,如果你有这样的代码:

 stateChange(-1); console.log("Hello"); 

console.log()语句将立即运行。 它不会等待在stateChange()函数中引发超时。 您不能只是暂停JavaScript执行一段预定的时间。

相反,任何想要运行延迟的代码都必须在setTimeout()callback函数内部(或者从该函数中调用)。

如果你试图通过循环“暂停”,那么你基本上“挂”了Javascript解释器一段时间。 因为JavaScript只在一个线程中运行你的代码,所以当你循环的时候没有其他的东西可以运行(没有其他的事件处理程序可以被调用)。 因此,循环等待某个variables将无法工作,因为没有其他代码可以运行来更改该variables。

如果你被允许使用jQuery:

 var delay = ( function() { var timer = 0; return function(callback, ms) { clearTimeout (timer); timer = setTimeout(callback, ms); }; })(); 

用法:

 delay(function(){ // do stuff }, 600 ); // end delay 

积分转到用户CMS,请参阅如何延迟.keyup()处理程序,直到用户停止键入?

尝试这个:

 //the code will execute in 1 3 5 7 9 seconds later function exec() { for(var i=0;i<5;i++) { setTimeout(function() { console.log(new Date()); //It's you code },(i+i+1)*1000); } } 

最好的方式来创build一个这样的函数在毫秒等待,这个函数将等待参数中提供的毫秒:

 function waitSeconds(iMilliSeconds) { var counter= 0 , start = new Date().getTime() , end = 0; while (counter < iMilliSeconds) { end = new Date().getTime(); counter = end - start; } } 

基于Joseph Silber的回答 ,我会这样做,更通用一些。

你会有你的function(让我们创build一个基于这个问题):

 function videoStopped(newState){ if (newState == -1) { alert('VIDEO HAS STOPPED'); } } 

你可以有一个等待的function:

 function wait(milliseconds, foo, arg){ setTimeout(function () { foo(arg); // will be executed after the specified time }, milliseconds); } 

最后你会有:

 wait(5000, videoStopped, newState); 

这是一个解决scheme,我宁愿不在等待函数中使用参数(只有foo();而不是foo(arg); )但是这是例子。

使用angularjs:

 $timeout(function(){ if(yourvariable===-1){ doSomeThingAfter5Seconds(); } },5000)