假设我有一些以10 as作为参数的setInterval调用。我启动它,并有一些需要25 to才能完成的JavaScript代码。在10 is之后,第一个间隔回调将排队。在20‘s之后,没有什么额外的排队等待,因为(我推测Web逻辑,如果这是发生setInterval滴答的地方,则决定这一点),setInterval的一个实例已经排队。
现在,在25 at时,当主逻辑完成时,setInterval就会启动,并且需要完成10 at(因此,当它完成时,35 at将通过程序执行)。在30 is时,当setInterval回调在堆栈中并正在执行时,会发生另一个滴答。现在会发生什么?setInterval回调队列的另一个实例会出现在事件队列中吗?或者浏览器环境会看到堆栈中有一个间隔实例正在执行,并跳过将一个新实例推送到事件队列,从而使下一个setInterval实例在40 is处勾选,最终推送一个新的回调。
发布于 2016-01-18 03:37:31
正如注释中提到的,JavaScript是单线程的。为了演示这一点,我测试了以下代码:
var count = 0;
var interval = setInterval(function() {
if (count >= 5) {
clearInterval(interval);
return;
}
var start = Date.now();
var number = ++count;
console.log("Call #" + number + " begin: " + start);
// Delay for 250 ms
while (Date.now() - start < 250) {}
var end = Date.now();
console.log("Call #" + number + " end: " + end + " Interval: " + (end - start));
}, 1);它的产出是:
Call #1 begin: 1453087997262
Call #1 end: 1453087997512 Interval: 250
Call #2 begin: 1453087997522
Call #2 end: 1453087997772 Interval: 250
Call #3 begin: 1453087997777
Call #3 end: 1453087998027 Interval: 250
Call #4 begin: 1453087998027
Call #4 end: 1453087998277 Interval: 250
Call #5 begin: 1453087998277
Call #5 end: 1453087998527 Interval: 250如果JavaScript是多线程的,则输出看起来更像:
Call #1 begin
Call #2 begin
Call #3 begin
Call #4 begin
Call #5 begin
// Approximate 245-250ms delay
Call #1 end Interval: 250
Call #2 end Interval: 250
Call #3 end Interval: 250
Call #4 end Interval: 250
Call #5 end Interval: 250演示的JSFiddle:https://jsfiddle.net/Hatchet/126kkjwh/
https://stackoverflow.com/questions/34846380
复制相似问题