工作模型
node采用一个长期运行的进程
node.js使用事件轮询:
node.js中,每个异步函数执行结束后,都会在事件队列中追加一个事件(同时保存一些必要参数)。事件轮询下一次循环便可取出事件,然后会调用异步方法对应的回调函数(参数)。这样一来,nodejs便能保证开发者编写的每行代码(每个回调)均在主线程中执行。
注意这里有一个问题,如果开发者在回调函数中调用了阻塞方法,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。正因为这样,nodejs中的一些库方法均是异步的,也提倡用户调用异步方法。
首次调用一个函数时,会创建一个调用堆栈。
错误处理
为什么要错误处理:node应用依托在一个拥有大量共享状态的大进程中。若某个回调函数出错,会影响整个进程--崩溃。
添加uncaughtException处理器,处理发生未被捕获的错误:
process.on('uncaughtException',function(err){
console.error();
process.exit(1);//手动退出
})
行文方式和分发error事件的API行为方式一致。比如,考虑如下例子,创建一个TCP服务器,并用telnet工具发起连接:
var net = require('net');
net.createServer(function(connection){
connection.on('error',function(err){
//err是一个错误对象
})
}).listen(400);
http、net等原生模块都会分发error事件,如果该事件未被处理,就会抛出未捕获的异常。
绝大多数node异步API接收的回调函数,第一个参数都是错误对象或者null;