Skip to content

异步函数进入到事件队列的时机

LYF edited this page Jun 29, 2016 · 4 revisions

1. setTimeout

进入时机是:过了指定的时间,由 事件触发线程 放入事件队列

2. 其他事件

进入时机是:触发时,由 事件触发线程 放入事件队列

3. 规范说明

关于setTimeout的入队时机,MDN上说的很清楚:

在浏览器里,当一个事件出现且有一个事件监听器被绑定时,消息会被随时添加。如果没有事件监听器,事件会丢失。所以点击一个附带点击事件处理函数的元素会添加一个消息。其它事件亦然。 调用 setTimeout 函数会在一个时间段过去后在队列中添加一个消息。这个时间段作为函数的第二个参数被传入。如果队列中没有其它消息,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少的时间 而非确切的时间。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop

其次是node文档关于EventEmiter的说明:

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

http://www.runoob.com/nodejs/nodejs-event.html

### 注意事项

在《JavaScript异步编程》这本书中,关于setTimeout的入队时机的说明是错误的(1.1.3 队列):

调用setTimeout的时候,会有一个延时事件排入队列

Clone this wiki locally