一,node','']; function fetchPage(url){ var start = new Date(); http'},function(res){ console的主页 4,第二个参数是一个以响应作为参数的回调函数 5,当远程服务器返回相应时,会触发回调函数。 6,在回调函数内记录响应状态码,如果有错误的话可以记录下来。 接下来,我们看看有4个不同的I/O操作都在发生,他们都使用回调 Js代码 var fs = require('fs'), http = require('http'); http"); })"); }).on('error',function(e){ console.log("Got error:" + e.message); }); fs.readFile('somefile2.txt','utf8',function(err,data){ if(err) throw err; console.log("somefile2"); }); 我们能知道哪个操作先返回吗? 猜测就是从磁盘上读取的两个文件先返回,因为无需进入网络,但是我们很难说哪个文件先返回,因为我们不知道文件的大小。对于两个主页的获取,脚本要进入网络,而响应时间则依赖于许多难以预测的事情,Node.js进程在还有已经注册的回调尚未触发之前将不会退出。回调首先解决不可预测性的方法,他也是处理并发(或者说一次做超过一件事情)的高效方法。 下面是我执行的结果 同步和异步代码 先看代码,同步(或者阻塞)代码 Js代码 function sleep(milliseconds){ var start = new Date().getTime(); while((new Date().getTime() -start) < milliseconds){ } } function fetchPage(){ console.log('fetching page'); sleep(2000); console.log('data returned from requesting page'); } function fetchApi(){ console.log('fetching api'); sleep(2000); console.log('data returned from the api'); } fetchPage(); fetchApi(); 当脚本运行时,fetchPage()函数会被调用,直到它返回之前,脚本的运行是被阻塞的,在fetchPage()函数返回之前,程序是不能移到fetchApi()函数中的。这称为阻塞操作。 Node.js几乎从不使用这种编码风格,而是异步地调用回调。 看下下面编码,, Js代码 var http = require('http'); function fetchPage(){ console.log('fetching page'); http.get({host:'',path:'/?delay=2000'}, function(res){ console.log('data returned from requesting page'); }).on('error',function(e){ console.log("There was an error" + e); }); } function fetchApi(){ console.log('fetching api'); http.get({host:'',path:'/?delay=2000'}, function(res){ console.log('data returned from requesting api'); }).on('error',function(e){ console.log("There was an error" + e); }); } fetchPage(); fetchApi(); 允许这段代码的时候,就不再等待fetchPage()函数返回了,fetchApi()函数随之立刻被调用。代码通过使用回调,是非阻塞的了。一旦调用了,两个函数都会侦听远程服务器的返回,并以此触发回调函数。 注意这些函数的返回顺序是无法保证的,而是和网络有关。 事件循环 Node.js使用javascript的事件循环来支持它所推崇的异步编程风格。基本上,事件循环使得系统可以将回调函数先保存起来,而后当事件在将来发生时再运行。这可以是数据库返回数据,也可以是HTTP请求返回数据。因为回调函数的执行被推迟到事件反生之后,于是就无需停止执行,控制流可以返回到Node运行时的环境,从而让其他事情发生。 Node.js经常被当作是一个网络编程框架,因为它的设计旨在处理网络中数据流的不确定性。促成这样的设计的是事件循环和对回调的使用,他们似的程序员可以编写对网络或I/O事件进行响应的异步代码。 需要遵循的规则有:函数必须快速返回,函数不得阻塞,长时间运行的操作必须移到另一个进程中。 Node.js所不适合的地方包括处理大量数据或者长时间运行计算等。Node.js旨在网络中推送数据并瞬间完成。