1.异步操作
- Node 采用 Chrome V8 引擎处理 JavaScript 脚本,V8 最大特点就是单线程运行,一次只能运行一个任务。
- Node 大量采用异步操作(asynchronous operation),即任务不是马上执行,而是插在任务队列的尾部,等到前面的任务运行完后再执行。
- 提高代码的响应能力
2.什么是异步
每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
这里推荐阮一峰的Javascript异步编程的4种方法
由于系统永远不知道用户什么时候会输入内容,所以代码不能永远停在一个地方;
Node 中的操作方式就是以异步回调的方式解决无状态的问题;
3.Node中回调函数的设计
对于一个函数如果需要定义回调函数:
- 回调函数一定作为参数的最后一个参数出现:
- function foo1(name, age, callback) { }
- function foo2(value, callback1, callback2) { }
- 回调函数的第一个参数默认接收错误信息(错误优先的回调函数),第二个参数才是真正的回调数据(便于外界获取调用的错误情况):
注意:上面说到了一个错误优先的回调函数,因为之后的操作大多数都是异步的方式,无法通过 try catch 捕获异常
演示一个自己定义的错误优先的回调函数,判断基数和偶数
/**
* 异步的回调的方式获取数据
*/
function isOddOrEvenAsync(number, callback) {
if (number && typeof number === 'number') {
if (number % 2) {
callback(null, '奇数');
} else {
callback(null, '偶数');
}
} else {
callback(new Error('你传的不是合法参数'));
}
}
isOddOrEvenAsync(19, function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});
isOddOrEvenAsync(10, function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});
isOddOrEvenAsync(0, function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});
isOddOrEvenAsync('aa', function (error, msg) {
if (error) {
console.error(error);
return false;
}
console.log(msg);
});