事件订阅/发布模式
事件监听器模式是一种广泛用于异步编程的模式,是回调函数的事件化,又称发布/订阅模式
Node自身提供events模块是发布订阅模式的一个简单实现
emitter.on(event, eventname);
emitter.emit(event, argv[0], argv[1]);
事件监听器模式也是一种hook机制,利用钩子导出内部数据或状态给外部的调用者
业务事件点:error data end
继承events模块
利用事件队列解决雪崩问题
利用once()方法将所有请求的回调都压入事件队列中,利用执行一次就会将监视器移除的特点,保证每一个回调只会被执行一次
多异步之间的协作方案
利用便函数完成多对一的收敛和事件订阅/发布模式中一对多的发散
EventProxy的原理
EventProxy的异常处理
Promise/Deferred模式
问题:需要一种先执行异步调用,延迟传递处理的方式 ---> Promise/Deferred模式
Promise
- 一个Promise对象只要具备then()方法即可
- 接受完成态、错误态的回调方法
- 可选的支持process事件回调作为第三个方法
- then()方法只接受function对象,其余对象将被忽略
- then()方法继续返回Promise对象,以事件链式调用 then(fulfilledHandler, errorHandler, processHandler)
状态转化示意图
Deferred 延迟对象
需要触发执行回调的地方
状态转化示意图
简单实现
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的进阶知识
……