参考网站:
node学习大牛观点https://segmentfault.com/a/1190000013933520
之所以说 Node.js 是单线程,就是因为在接受任务的时候是单线程的,它无需进程/线程切换上下文的成本,非常高效,但它在执行具体任务的时候是多线程的。
Node.js 同时支持这2种 JavaScript 引擎,二者性能和特性上各有千秋,ChakraCore
在特性上感觉更潮一些,曾经是第一个支持 Async函数
的引擎,但目前 Node.js 还是以 Chrome V8 引擎为主, ChakraCore
版本需要单独安装,大家了解一下就好。
抽象,继承,封装,多态4个基本特征。如果想用好,你甚至还需要看一些设计模式相关的书。好在有《JavaScript设计模式》一书。Koa2里已经在用这种写法了。
a)Error-first Callback
定义错误优先的回调写法只需要注意2条规则即可:
- 回调函数的第一个参数返回的error对象,如果error发生了,它会作为第一个err参数返回,如果没有,一般做法是返回null。
- 回调函数的第二个参数返回的是任何成功响应的结果数据。如果结果正常,没有error发生,err会被设置为null,并在第二个参数就出返回成功结果数据。
下面让我们看一下调用函数示例,Node.js 文档里最常采用下面这样的回调方式:
function(err, res) {
// process the error and result
}
这里的 callback
指的是带有2个参数的函数:"err"和 "res"。语义上讲,非空的“err”相当于程序异常;而空的“err”相当于可以正常返回结果“res”,无任何异常。
EventEmitter
事件模块是 Node.js 内置的对观察者模式“发布/订阅”(publish/subscribe)的实现,通过EventEmitter
属性,提供了一个构造函数。该构造函数的实例具有 on
方法,可以用来监听指定事件,并触发回调函数(用emit函数发布)。任意对象都可以发布指定事件,都会被 EventEmitter
实例的 on
方法监听到
// 获得events事件模块
var EventEmitter = require('events')
var util = require('util')
var MyEmitter = function () {
}
util.inherits(MyEmitter, EventEmitter)
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
console.log(a, b, this);
// Prints: a b {}
});
myEmitter.emit('event', 'a', 'b');
如何更好的查Node.js文档
Node.js的API都是异步的,同步的函数是奢求,要查API文档,在高并发场景下慎用。
中流砥柱:Promise
Promise意味着[许愿|承诺]一个还没有完成的操作,但在未来会完成的。
与Promise最主要的交互方法是通过将函数传入它的then方法从而获取得Promise最终的值或Promise最终最拒绝(reject)的原因。要点有三个:
- 递归,每个异步操作返回的都是promise对象
- 状态机:三种状态转换,只在promise对象内部可以控制,外部不能改变状态
- 全局异常处理