一、回调
回调(Callback)是javascript中常用的使用方法,简单而言,就是:函数作为参数传递到另一个函数中,然后被调用。
同样,在Node.js中,比如I/O操作发生的地方,经常使用回调模式。通过在回调函数中嵌套回调函数,可以控制事情的顺序(使用回调的根本出发点),比如从数据库读取数据后通过回调用另一个函数处理数据。
一个简单的栗子,
var fs=require('fs'); //请求调用fs(filesystem)模块,在脚本使用
fs.readFile('filename.txt','utf8',function(err,data){ //前两个参数分别为路径和文件编码,第三个参数为回调函数
if(err) throw err; //如果读取文件有误,抛出错误
console.log(data); //否则,来自文件的数据会显示在控制台上
});
另一个例子是使用http模块创建http客户端和服务器,http.get()方法用来请求Web服务器并获得相应数据。
回调函数的调用发生在远程服务器发回响应之后,由于代码必须进入网络获取数据,无法确切知道数据何时返回。
回调可以让代码在其他事件发生时能够运行,当事件发生时,回调被触发(fired),从而导致回调函数被调用。
var http=require('http'); //请求http模块
http.get({host:'baidu.com'},function(res){ //参数1获取主页,参数2为回调函数,其参数响应
console.log("Got response:"+res.statusCode); //远程服务器返回响应时,触发此匿名回调函数
}).on('error',function(e){
console.log("Got error:"+e.message);
});
所谓同步,即每次执行一个操作,在一个操作完成之前,代码的执行会被阻塞,无法继续下一个操作。所谓异步(非阻塞),指的是基于回调、允许脚本并行执行操作的方法,操作结果会在事件发生时由回调来处理,从而无需等待某个操作的结果继续下一步。
而为了在网络和I/O操作中处理并发,Node.js运行在单一进程并使用异步编码风格。
三、事件循环
时间循环可以将回调函数先保存起来,当事件将来再次发生在运行。无论是数据库返回数据还是http请求返回数据,回调函数的执行被推迟到事件的发生之后。JavaScript的事件循环特性对于基于浏览器的交互是个良好选择,预测事件何时发生不太现实。Node.js将这一方法用到服务器端的网络和I/O操作中。