2.2.3 node 异步编程

194 阅读1分钟

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 库
    1. 串行无关联:async.series (按着步骤顺序执行,但是每个步骤运行结果是没有关联的)
    2. 并行无关联:async.parallel (所有异步操作并行执行,等所有操作都完成后在一起处理)
    3. 串行有关联:waterfall (第一步的运行结果会传给第二步,第二步运行结果会发给第三部)
    4. parallelLimit并发限制 (与async.parallel相似,但是多一个限制,任务同时只能并发一定数量,不是无限的)

异步并发

通过一个队列控制并发;当前并发小于限定,从队列中取出执行,否则暂存到队列中

  • bagpipe

  • async.parallelLimit()