什么是sleep()的JavaScript版本?
有没有更好的方法来设计一个sleep
JavaScript比下面的pausecomp
函数(从这里取得)?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
这不是JavaScript中Sleep的重复 - 动作之间的延迟; 我想在函数中间进行真正的睡眠,而不是执行一段代码之前的延迟。
2017更新
自2009年问这个问题以来,JavaScript已经发生了重大变化。 所有其他答案现在已经过时或过于复杂。 这是目前的最佳做法:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function demo() {
console.log('Taking a break...');
await sleep(2000);
console.log('Two second later');
}
demo();
就是这个。 await sleep(<duration>)
。
你可以在Runkit上试试这段代码。 注意,
await
只能在以async
关键字为前缀的函数中执行。 在执行它之前,Runkit将代码封装在异步函数中。 await
暂停当前的async
功能 两个新的JavaScript功能帮助编写了这个实际的“睡眠”功能:
async/await
功能让代码明确地等待承诺解决。 兼容性
async
/ await
在V8登陆并且自Chrome 55以来默认启用 如果由于某种原因,您使用的节点年龄超过7岁,或者针对的是旧版浏览器,那么async
/ await
仍然可以通过Babel(一种将JavaScript +新功能转换为普通旧JavaScript的工具)使用,同时使用transform-async-to-generator
插件。 跑
npm install babel-cli --save
用以下方法创建.babelrc
:
{
"plugins": [
"transform-async-to-generator",
]
}
然后运行你的代码
node_modules/babel-cli/bin/babel-node.js sleep.js
但是,如果您使用的是Node 7或更高版本,或者您的目标是现代浏览器,则不需要此操作。
(请参阅2016年更新的答案)
我认为想要执行一个动作,等待然后执行另一个动作是完全合理的。 如果您习惯于使用多线程语言编写代码,那么您可能会想到在您的线程唤醒之前让您执行一段时间。
这里的问题是JavaScript是一个基于事件的单线程模型。 虽然在特定情况下,让整个引擎等待几秒钟可能会很好,但总的来说这是不好的做法。 假设我想在写我自己的时候使用你的功能? 当我调用你的方法时,我的方法都会冻结。 如果JavaScript可以以某种方式保存你的函数的执行上下文,将它存储在某个地方,然后将其还原并稍后继续,然后可以进行睡眠,但这基本上是线程化的。
所以你几乎坚持别人的建议 - 你需要把你的代码分解成多个函数。
那么你的问题有点错误选择。 没有办法以你想要的方式睡觉,也不应该追求你所建议的解决方案。
在JavaScript中,我重写了每个函数,以便它可以尽快结束。 您希望浏览器重新进入控制状态,以便可以改变DOM。
每次我在我的函数中想要一个睡眠时,我都会重构使用setTimeout()
。
我要编辑这个答案,因为我发现这是有用的:
臭名昭着的睡眠或延迟功能在任何语言中都有很多争论。 有人会说,应该总是有一个信号或回调来触发一个给定的功能,其他人会说有时候任意时刻的延迟都是有用的。 我说每个人都有自己的规则,一个规则决不能决定这个行业的任何东西。
编写睡眠函数非常简单,使用JavaScript Promise更加实用:
// sleep time expects milliseconds
function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
// Usage!
sleep(500).then(() => {
// Do something after the sleep!
});
链接地址: http://www.djcxy.com/p/16399.html