javascript中的延迟/睡眠?
Posted
技术标签:
【中文标题】javascript中的延迟/睡眠?【英文标题】:delay/sleep in javascript? 【发布时间】:2012-04-02 01:59:01 【问题描述】:有没有一种简单的方法可以在 javascript 中暂停脚本?我正在寻找与 Python 中的 time.sleep(1)
等效的 javascript。我不想要setTimeout(continueExecution, 10)
,或任何带有getTime
的东西。这个可以吗?
编辑:这不是那么容易,但我想我可以通过 setTimeout
完成它
【问题讨论】:
JavaScript 中的编程模型通常是非阻塞的,因此您不会有任何阻塞调用,例如sleep()
函数。
否 --- 另请参阅 this maybe duplicate thread
你为什么不想使用setTimeout
?
只是出于好奇-您想要一种睡眠方法的原因是什么?如果你想要一种 sleep 方法,有可能有一种不那么老套的方法来完成它。 :](不是说有睡眠方法)
看看这个帖子:***.com/questions/5832276/…
【参考方案1】:
JavaScript 通常使用事件循环在单个线程中运行。这就是为什么你不能做任何“Thread.sleep”。如果可以的话,它会在这段时间内冻结其他所有内容,并且相信我,您不想这样做。这就是为什么 JavaScript 中几乎所有东西都使用非阻塞 IO 运行的原因,这就是为什么延迟执行的唯一方法是使用 setTimeout 或 setInterval。
【讨论】:
【参考方案2】:如果没有 setTimeout,您可以一直循环,直到达到所需的日期时间:
免责声明: 这是未经测试的。 由于 javascript 是单线程的,这将在循环时冻结整个浏览器。有关此主题的更多信息,请参阅other questions。
var delay = 5; // 5 second delay
var now = new Date();
var desiredTime = new Date().setSeconds(now.getSeconds() + delay);
while (now < desiredTime)
now = new Date(); // update the current time
// continue execution
【讨论】:
我只是在写类似的东西。 它显然未经测试,因为如果您尝试这样做,这只会在这段时间内冻结您的浏览器。 OP也明确表示他不想要任何“getTime”之类的方法。 @HoLyVieR OP 表示他想“暂停脚本” - 如果您暂停 javascript,您将阻止浏览器。期间。 @HoLyVieR:OP 可能说过他不想使用getTime
,但这并不意味着他是正确的。 “满足” OP(不可能的)欲望的唯一方法就是这样做。是的,它会冻结您的浏览器,但这就是您(出于某种原因)不想使用 setTimeout
的结果。
@jbabey 我添加评论的原因是指出您应该编辑您的答案以反映这一点。以 JavaScript 开头的人并不总是明白这只会冻结浏览器。【参考方案3】:
如果你使用 jQuery 1.5+,你可以制作一个非常简单的插件(i
(function($)
$.wait = function(time)
return $.Deferred(function(dfd)
setTimeout(dfd.resolve, time); // use setTimeout internally.
).promise();
(jQuery));
然后像这样使用它:
$.wait(3000).then(function()
....
);
它会在等待 3 秒后启动您的功能。它在内部使用 setTimeout,但这是在 JavaScript 中执行此操作的唯一方法。
【讨论】:
或setTimeout(func, 3000)
(到底发生了什么)?【参考方案4】:
你可以使用这个代码:(从http://www.phpied.com/sleep-in-javascript/偷来的)
function sleep(milliseconds)
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++)
if ((new Date().getTime() - start) > milliseconds)
break;
这实际上会阻止脚本执行,无论您想要多少毫秒。除非您尝试模拟需要很长时间的任务或类似的任务,否则不要使用它。
【讨论】:
【参考方案5】:我们有一个名为 sleep 的 npm 包,你可以看到它here
为了简单地使用它
var sleep = require('sleep');
sleep.sleep(10) //sleep for 10 seconds
但要注意这一点
这些调用将通过停止 Node.js 的事件循环来阻止所有 JavaScript 的执行!
如果你想安心睡觉,可以使用then-sleep npm 包,这是一个不错的选择
var sleep = require('then-sleep');
// Sleep for 1 second and do something then.
sleep(1000).then(...);
如果你使用ES7
,你也可以使用es7-sleep npm package
【讨论】:
【参考方案6】:你做这样的事情
// place you code in this function
(async function main()
//Do something
console.log("something Done first ")
// code execution will halt for period (ms)
await sleep(3000)
console.log("something Done 3 seconds later ")
//Do something
)()
function sleep(period)
return new Promise(resolve =>
setTimeout(() =>
resolve();
, period);
);
【讨论】:
【参考方案7】:如果你使用 node 9.3 或更高版本,你可以像这样使用Atomics.wait()
function msleep(n)
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
function sleep(n)
msleep(n*1000);
现在您可以拨打sleep()
【讨论】:
谢谢,现在参与我 Javascript 项目的 Python 开发人员正在锁定整个线程。以上是关于javascript中的延迟/睡眠?的主要内容,如果未能解决你的问题,请参考以下文章
如何在JavaScript中使用async / await延迟数组回调?
如何在Javascript中制作精确的睡眠功能,可能使用承诺?