事件循环队列和优先级

时间:2012-05-01 16:01:59

标签: node.js

想知道是否有人可以澄清以下内容:

// Gets fired 10000 times

fireEvent( function(){

  console.log( 'first' );

  setTimeout( ( function(){ console.log( 'second' ); } ), 100 );

});

这将输出10000 x“first”然后输出10000 x“second”。是因为console.log('first')在console.log('second')之前的事件循环中首先排队?

1 个答案:

答案 0 :(得分:4)

您正在将一个函数(文字)传递给函数fireEvent,fireEvent可能会在某个时候调用...但是您还没有为fireEvent粘贴代码,以便我们知道fireEvent究竟做了什么。 另外,如何调用fireEvent()?它在循环中被调用了1000次吗?

目前,希望以下示例可能有助于了解正在发生的事情。

function foo() {
    console.log( 'first' );
    setTimeout( ( function(){ console.log( 'second' ); } ), 100 );

}

for (var i = 0; i < 1000; i++) {
    foo();
}

这将打印“第一”一千次,然后“第二次”打印一千次。

在这种情况下,应该相当明显发生了什么:for循环在小于100秒的超时时间内完成,因此每次调用foo()都会打印'first'并在回调之前返回打印'第二个'有机会执行。

然而,这是有趣的一点,即使超时时间非常短(比如说5毫秒)并且循环运行了一百万次,你仍然可以“首次”打印一百万次,然后“第二次”获取打印了一百万次。 (即使循环现在执行的时间可能超过5毫秒)。

function foo() {
    console.log( 'first' );
    setTimeout( ( function(){ console.log( 'second' ); } ), 5);

}

for (var i = 0; i < 1000000; i++) {
    foo();
}

这是因为setTimeout仅设置最小期间,之后将调用回调。 JavaScript是单线程的。如果事件触发(或回调的超时时间超时),则在没有任何操作的情况下执行其处理程序,即事件循环是否空闲。但是,如果超时触发,并且javascript事件循环繁忙,则回调(以及任何准备处理的后续事件等)将被放入队列,直到事件循环可以自由执行它们。

希望这有帮助。