node是基于事件驱动的非阻塞io模型
发布/订阅者
//引入events模块
let Events=require('events');
// console.log(Events);
let myEvents=new Events();
//注册一个监听事件,监听的是谁 回调函数
myEvents.on('happy',(name)=>{
console.log(name+'开心');
})
//注册 事件
myEvents.emit('happy','张三');
promise/deferred
promise/deferred 模式 其实包含两部分:Promise 和 Deferred。
- Deferred主要是用于内部,来维护异步模型的状态。
- Promise只要用于外部,通过then()方法,暴露给外部调用,以添加业务逻辑和业务的组装。
function Promise() {
this.handler = {};
}
Promise.prototype.then = function (onFulfilled, onRejected) {
var handler = {}
if (typeof onFulfilled === 'function') {
handler.resolve = onFulfilled
}
if (typeof onRejected === 'function') {
handler.reject = onRejected
}
this.handler = handler
return this
}
function Deferred() {
/* 状态:默认 等待态 pending */
this.state = 'pending';
this.promise = new Promise()
}
Deferred.prototype.resolve = function (obj) {
this.state = 'fulfilled'
var handler = this.promise.handler
if (handler && handler.resolve) {
handler.resolve(obj)
}
}
Deferred.prototype.reject = function (obj) {
this.state = 'rejected'
var handler = this.promise.handler
if (handler && handler.reject) {
handler.reject(obj)
}
}
流程控制库
流程控制是让一组异步任务顺序执行的概念,流程控制分为串行和并行.
- app.use洋葱模型
- async 库
- 串行无关联:async.series (按着步骤顺序执行,但是每个步骤运行结果是没有关联的)
- 并行无关联:async.parallel (所有异步操作并行执行,等所有操作都完成后在一起处理)
- 串行有关联:waterfall (第一步的运行结果会传给第二步,第二步运行结果会发给第三部)
- parallelLimit并发限制 (与async.parallel相似,但是多一个限制,任务同时只能并发一定数量,不是无限的)
异步并发
通过一个队列控制并发;当前并发小于限定,从队列中取出执行,否则暂存到队列中
-
bagpipe
-
async.parallelLimit()