睡眠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()
如果你想要比setTimeout
和setInterval
更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
函数,让我们先了解它。 该函数有三个参数: function
或code
, delay
(以毫秒为单位)和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