实例
虽然在其它语言中,基于事件的编程是一种不太常见的风格,但却是编写面向浏览器JavaScript代码的首要方式,Node就沿袭了这一传统。不论是写面向浏览器的代码还是用Node写服务端代码,都可以用事件的编程方式来实现。例如,下面是jQuery的文档中所介绍的如何发起一个异步(即Ajax)数据请求:
$.get(ajax/test.html, function(data){
$(.result).html(data);
alert(Load was performed.);
});
$(.result).html(data);
alert(Load was performed.);
});
在Node中编写的基于事件的程序又是什么样子呢?以下是Dahl在JSConf演示的代码段:
db.query("select..", function (result) {
// use result
});
// use result
});
在这个例子中,完成了一个数据库查询,而同时也附上了一个回调函数。当数据库返回结果时,回调函数将会被执行。代码块通过事件相联系。如果没有数据库事件被触发,该程序可以运行其它代码,处理其它事件。与之相对照,用普通的处理方式,这就得写成这样:
var result = db.query("select * from T");
// use result
// use result
普通的处理方式中存在的问题是:在等待数据库返回结果时,整个程序都被阻塞了,什么事都做不了。解决这一问题的传统办法是把数据库调用放到另外一个单独的线程或进程中。而Dahl在JSConf上介绍说,这种基于事件的模型更能有效的利用CPU和内存,同时其可扩展性也更好。与多进程或者多线程程序相比,基于事件的框架可以事半功倍。