你的位置:首页 > Java教程

[Java教程]Node.js入门学习笔记(三)

基于事件驱动的回调

这个问题不好回答,不过这是Node.js原生的工作方式。它是事件驱动的,这也是它为什么这么快的原因。你可以花一点时间阅读一下Felix Geisendörfer的大作

Understanding node.js 可了解一些背景知识。

当我们使用http.createServer方法的时候,我们当然不只是想要一个侦听某个端口的服务器,我们还想要这在服务器收到一个HTTP请求的时候做点什么。

问题是,这是异步的,请求任何时候都可能到达,但是我们的服务器却跑在一个单进程中。

写PHP应用的时候,我们一点也不为此担心:任何时候当有请求进入的时候,网页服务器(通常是Apache)就为这一请求新建一个进程,并且开始从头到尾执行相应的PHP脚本。

那么我们在Node.js程序中,当一个新的请求到达8888端口的时候,我们应该怎么控制流程呢?

这就是Node.js/javascript的事件驱动设计能够真正帮上忙的地方了——虽然我们还得学一些新概念才能掌握它。让我们来看看这些概念是怎么应用在我们的服务器代码里的。

我们创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。

我们不知道这件事情什么时候发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了。

这个就是传说中的回调。我们给某个方法传递了一个函数,这个方法在有相应事件发生的时候调用这个函数来进行回调。

至少对我来说,需要一些功夫才能弄懂它。你如果还是不太确定的话就再去读读Felix的博客文章。

让我们再来琢磨琢磨这个新概念。我们怎么证明,在创建完服务器之后,即使没有HTTP请求进来、我们的回调函数也没有被调用的情况下,我们的代码还继续有效呢?我们试试这个:

 

var http = require("http"); 
function onRequest(request, response) { 
  console.log("Request received."); 
  response.writeHead(200, {"Content-Type": "text/plain"}); 
  response.write("Hello World"); response.end(); 

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");

注意:在onRequest(我们定义的回调函数)触发的地方,使用console.log()输出了一段文本信息。在HTTP服务器开始工作之后,也输出一段文本。

当我们与往常一样,运行node server.js时,它会马上在命令行输出"Server has started."。当我们向服务器发出请求(在浏览器中访问htt://localhost:8888),在命令行中会出现"Request received."

这就是事件驱动的异步服务器端JavaScript和它的回调啦!