1 异步编程
Node采用V8引擎处理JS脚本,最大特点就是单线程运行,一次只能运行一个任务;这导致大量采用异步操作,即任务不马上执行,而是插在任务队列的尾部,等前面的任务运行完再执行。
约定:回调函数应该是某个函数的最后一个参数;回调函数的第一个参数,是上一步传入的错误对象(没有错误传入null)。原因是传统的try...catch机制对异步操作行不通,只能把错误交给回调函数来处理。
# 异步
var task = function(value, callback) {
if (value === true) {
callback(null, "Value was true.");
} else {
callback(new Error("Value is not true!"));
}
};
var callback = function(error, value) {
if (error) {
return console.log(error);
}
console.log(value);
};
# 同步
function main() {
syncA();
syncB();
syncC();
}
try {
main();
} catch (error) {
// Deal with exception.
}
2 异常处理
Node是单线程运行环境,所以一旦抛出的异常没有被捕获,将会引起整个进程的崩溃。
2.1 try...catch
无法捕获异步代码抛出的异常;所以Node在很少的场合使用try/catch语句,比如JSON.parse解析JSON文本。
2.2 回调函数
将错误对象作为回调函数的第一个参数,就避免了捕获代码与发生错误不在同一个时间段的问题。
fs.readFile('./foo.txt', function(err, data) {
if (err !== null) throw err;
console.log(data);
});
2.3 EventEmitter的error事件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();
emitter.emit('error', new Error('Something bad happened'));
# 对error事件部署监听函数
emitter.on('error', function(err) {
console.log('Error: ' + err.message);
});
2.4 uncaughtException和unhandledRejection事件
以后再整理。