Javascript在setInterval中的执行顺序

时间:2013-02-03 05:07:08

标签: javascript execution

假设我在setInterval中运行了一些代码。也就是说,一堆代码每隔33ms开始运行一次。

在这一堆代码中是一个函数,我们称之为Overlord函数,它根据某些状态变量的值执行其他函数。

问题是:

假设Overlord执行function1。假设function1在33ms后没有完成运行(或者间隔长度是什么)。然后Overlord执行function2,而function1可能仍在运行。会发生什么?

在javascript运行function2之前,function1是否完成?是否有某种内置于javascript执行的que?

谢谢!

3 个答案:

答案 0 :(得分:7)

Javascript是单线程的,因此第二个函数将排队,但在第一个函数完成执行之前无法执行。也就是说,如果您的函数执行时间超过33毫秒,最好将其分解为小的异步块(以防止锁定接口)。

答案 1 :(得分:2)

setInterval可以快速成为 真正糟糕的想法 ™。

问题在于:

如果你致电setInterval(lots_O_functions, 15);将要发生的事情是lots_O_functions将在15毫秒之后被召唤,但是如果需要,比如45毫秒完成所有这些工作,那么&# #39;不会被打断,相反,当你的第一个完成后,你还有两个lots_O_functions个电话等待运行......

...假设这两个人每人需要45毫秒,你现在又有6个lots_O_functions个电话在排队......

这是你想要发生的吗?我不知道。就我个人而言,大多数时候我并不是这样说,原因如下:

JS在单个线程上运行。事实上,在浏览器中几乎 一切 (点击,重新绘制页面上的元素,甚至离开页面并转到其他地方)都绑定到同一个线程中绝大多数情况。

因此重叠调用重函数会阻塞该线程 NOT GOOD

相反,为什么不能有这样的东西:

var big_state_machine = { /*...*/ },
    lots_O_work = function () {
        big_state_machine.currentState.jobs.forEach(/*...*/);
        /*....... do lots o' work ......*/
        var more_work_to_do = /* figure out if you need to rerun lots_O_work */;

        if (more_work_to_do) { setTimeout(lots_O_work, 20); }
    };


lots_O_work();

现在,它会做它需要做的事情,如果之后还有更多工作要做,它会调用setTimeout为自己排队

setTimeout不像sleepwait,它说:"看看未来20ms,看看有多少人已经在等待做事......从那里开始,让我进入下一个可用的位置"。

这里的不同之处在于,您在第一个功能完成后20ms完成了这项工作,这意味着其他事情至少需要20ms(点击,绘画,AJAX等)。

使用setInterval,它与setTimeout类似,但不是在之后的下一个可用地点排队,而是将自己设置在队列中,是否准备好(或需要)。

你可以更进一步打破它,以保持它真正的响应,但这将是一个良好的开端。

答案 2 :(得分:1)

Javascript是单线程的,所以你很安全....大部分时间。在function1完成之前,function2将运行的唯一方法是,如果function1具有任何异步代码,其回调类似于ajax调用或另一个setTimeout或setInterval。例如:

var setInterval(function(){

    //.. 
    function1();
    function2();

}, 33);

var globalVariable = 0;

var function1 = function(){
    console.log(globalVariable);

    setTimeout(function(){
        globalVariable+=2;
    }, 1000);
};
var function2 = function(){
    console.log(globalVariable);
};

该程序的输出将为。

- 大于0

- 大于0

- →2

- →2

你可能已经预料到了。

- 大于0

- →2

- →2

- →4