首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setInterval与事件循环

setInterval与事件循环
EN

Stack Overflow用户
提问于 2016-01-18 02:27:32
回答 1查看 2.1K关注 0票数 1

假设我有一些以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处勾选,最终推送一个新的回调。

EN

回答 1

Stack Overflow用户

发布于 2016-01-18 03:37:31

正如注释中提到的,JavaScript是单线程的。为了演示这一点,我测试了以下代码:

代码语言: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);

它的产出是:

代码语言:javascript
复制
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是多线程的,则输出看起来更像:

代码语言: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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34846380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档