您的位置:首页 > Web前端 > Node.js

理解Node.js的回调(Callback)

2014-11-21 19:01 369 查看
一、回调

回调(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操作中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: