setTimeout
等待2-4倍于被配置为执行的时间的原因是什么?
var TIMEOUT = 700;
console.log("TIMEOUT", TIMEOUT);
var preTimeout = new Date();
setTimeout(function() {
console.log("timeout took:", new Date() - preTimeout);
}, TIMEOUT);
这将导致1200-4000的timeout took:
出现在网站上。
发布于 2017-10-14 18:36:34
setTimeout()
并不意味着在精确的N毫秒之后执行代码。这意味着,至少不能执行N毫秒的代码。
异步代码(如setTimeout()
回调)被放置在事件循环队列中,直到所有同步代码完成执行,然后运行。这包括在超时之前在队列中运行的任何异步代码。只有在完成所有这些操作之后,您的回调才能运行。
下面是一个使用同步while
循环展示这一点的小演示:
https://jsfiddle.net/foxbunny/1a9rckdq/
就像演示中的代码一样,您会听到有人提到“阻塞”。这是因为它阻塞了事件循环队列。
如果您想要一个粗浅概述,我还写了一篇关于这个主题的长篇文章。
https://stackoverflow.com/questions/46747971
复制相似问题