睡眠JavaScript – 行动之间的延迟

在执行另一个操作之前,有没有一种方法可以在JavaScript中进行睡眠?

例:

var a = 1+3; // Sleep 3 seconds before the next action here var b = a + 4; 

你可以使用setTimeout来达到类似的效果:

 var a = 1 + 3; var b; setTimeout(function() { b = a + 4; }, (3 * 1000)); 

这并不是真正的“睡眠”JavaScript–它只是执行一段时间(以毫秒为单位)后传递给setTimeout的函数。 尽pipe可以为JavaScript编写睡眠函数,但如果可能,最好使用setTimeout ,因为它不会在睡眠期间冻结所有内容。

如果你真的需要一个sleep()只是为了testing一些东西。 但是请注意,在debugging时大部分时间都会使浏览器崩溃 – 可能这就是为什么您需要它。 在生产模式中,我会注释掉这个function。

 function pauseBrowser(millis) { var date = Date.now(); var curDate = null; do { curDate = Date.now(); } while (curDate-date < millis); } 

不要在循环中使用new Date() ,除非想要浪费内存,处理能力,电池以及设备的寿命。

ECMAScript 6版本,使用带有“代码阻塞”收益率的生成器:

因为原来的问题是在七年前发布的,所以我没有用精确的代码来回答,因为这太简单了,而且已经得到了答案。 这应该有助于解决更复杂的问题,例如,如果您至less需要两次睡眠,或者您计划对asynchronous执行进行sorting。 随意修改它,以适应您的需求。

 let sleeptime = 100 function* clock() { let i = 0 while( i <= 10000 ) { i++ console.log(i); // actually, just do stuff you wanna do. setTimeout( ()=> { clk.next() } , sleeptime ) yield } } let clk = clock() clk.next() 

如果你想要比setTimeoutsetInterval更less笨重的函数,你可以把它们包装在函数中,这些函数只是颠倒了参数的顺序,并给了它们很好的名字:

 function after(ms, fn){ setTimeout(fn, ms); } function every(ms, fn){ setInterval(fn, ms); } 

CoffeeScript版本:

 after = (ms, fn)-> setTimeout fn, ms every = (ms, fn)-> setInterval fn, ms 

然后你可以用匿名函数很好地使用它们:

 after(1000, function(){ console.log("it's been a second"); after(1000, function(){ console.log("it's been another second"); }); }); 

现在它很容易读取为“在N毫秒之后……”(或者“每N毫秒……”)

2017更新

JavaScript已经发展,因为这个问题被问及现在有发电机function,新的asynchronous/等待/承诺正在推出。 下面有两个解决scheme,其中一个具有可在所有现代浏览器上工作的生成器函数,另一个使用尚未支持的新asynchronous/等待。

使用生成器函数:

 'use strict'; let myAsync = (g) => (...args) => { let f, res = () => f.next(), sleep = (ms) => setTimeout(res, ms); f = g.apply({sleep}, args); f.next(); }; let myAsyncFunc = myAsync(function*() { let {sleep} = this; console.log("Sleeping"); yield sleep(3000); console.log("Done"); }); myAsyncFunc(); 

有几种方法可以解决这个问题。 如果我们使用setTimeout函数,让我们先了解它。 该函数有三个参数: functioncodedelay (以毫秒为单位)和parameters 。 由于函数代码参数是必需的,其他的是可选的。 一旦你没有input延迟 ,它将被设置为零。

有关setTimeout()更多详细信息, 请转到此链接 。

简化版本:

 var a = 1 + 3; var b; console.log('a = ' + a); setTimeout(function(){ b = a + 4; console.log('b = ' + b); }, 1000); 

输出:
a = 4
24 – >活动超时列表的数字标识符
b = 8

使用parameter passing:

 var a = 1 + 3; var b; console.log('a = ' + a); setTimeout(myFunction, 1000, a); function myFunction(a) { var b = a + 4; console.log('b = ' + b); } 

输出:
a = 4
25 – >活动超时列表的数字标识符
b = 8

浏览器支持:

 Chrome浏览器边缘Safari浏览器Opera
 1.0 1.0 4.0 1.0 4.0