Nodejs 异步编程|事件

124 阅读2分钟

事件订阅/发布模式

事件监听器模式是一种广泛用于异步编程的模式,是回调函数的事件化,又称发布/订阅模式
Node自身提供events模块是发布订阅模式的一个简单实现

emitter.on(event, eventname);
emitter.emit(event, argv[0], argv[1]);

事件监听器模式也是一种hook机制,利用钩子导出内部数据或状态给外部的调用者
业务事件点:error data end

image.jpeg

继承events模块

image.jpeg

利用事件队列解决雪崩问题

利用once()方法将所有请求的回调都压入事件队列中,利用执行一次就会将监视器移除的特点,保证每一个回调只会被执行一次

多异步之间的协作方案

利用便函数完成多对一的收敛和事件订阅/发布模式中一对多的发散

EventProxy的原理

EventProxy的异常处理

Promise/Deferred模式

问题:需要一种先执行异步调用,延迟传递处理的方式 ---> Promise/Deferred模式

Promise

  • 一个Promise对象只要具备then()方法即可
  • 接受完成态、错误态的回调方法
  • 可选的支持process事件回调作为第三个方法
  • then()方法只接受function对象,其余对象将被忽略
  • then()方法继续返回Promise对象,以事件链式调用 then(fulfilledHandler, errorHandler, processHandler)
状态转化示意图

image.jpeg

Deferred 延迟对象

需要触发执行回调的地方

状态转化示意图

image.jpeg

简单实现

var promisify = function(res) {
    var deferred = new Deferred();
    var result = '';
    res.on('data', funciton(chunk){
        result += chunk;
        deferred.progress(chunk);
    });
    res.on('end', function() {
        promise.resolve(result);
    });
    res.on('error', function(err) {
        promise.reject(err);
    });
    return deferred.promise;        // 目的是为利不让外部程序调用resolve() reject()方法,更改内部状态的行为交由定义者处理
    
    // 调用
    promisify(res).then(function() {
        // Done
    }, function(err) {
        // Error
    }, function(chunk) {
        // progress
        console.log('BODY:' + chunk);
    });
}

两者关系

Deferred主要用于内部,维护异步模型的状态
Promise作用于外部,通过then()方法暴露给外部以添加自定义逻辑

Promise中的多异步协作

Promise的进阶知识

……