异步式I/O(非阻塞式I/O): 当线程遇到I/O(磁盘读写或网络通信统称为I/O操作),将I/O请求发送给操作系统,继续执行下一条语句。当操作系统完成I/O操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件。
例子:
文件readfile.js
var
fs =
require(
'fs');
fs.
readFile(
'file.txt',
'utf-8',
function(
err,
data){
if(
err){
console.
error(
err);
}
else{
console.
log(
data);
}
});
console.
log(
'end.');
进入文件所在目录运行node readfile.js
运行结果如下:
先输出了end. 其次才是文件的内容。
fs.readfile 调用时只将异步式I/O请求发送给了操作系统,然后立即执行后面的语句,执行完后进入事件循环监听事件。
当fs接收到I/O请求完成时,事件循环会主动调用回调函数以完成后续工作。
事件
JavaScript 中事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。
Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。 事件是由EventEmitter对象提供。
Node.js没有显示的事件循环,Node.js的事件循环对开发者不可见,有libev库实现。
fs.readFile 和 http.createServer的回调函数都是通过EventEmitter来实现的。
Node.js 程序是由事件循环开始的,到事件循环结束,所有的逻辑都是事件的回调函数,所以程序入口就是事件循环第一个事件的回调函数。