2019年底

// 简易版emit/on
function Pubsub(){
//存放事件和对应的处理方法
this.handles = {};
}
Pubsub.prototype={
//传入事件类型type和事件处理handle
on: function (type, handle) {
if(!this.handles[type]){
this.handles[type] = [];
}
this.handles[type].push(handle);
},
emit: function () {
//通过传入参数获取事件类型
var type = Array.prototype.shift.call(arguments);
console.log(type, 'type');
if(!this.handles[type]){
return false;
}
for (var i = 0; i < this.handles[type].length; i++) {
var handle = this.handles[type][i];
//执行事件
console.log(handle, 'handle', arguments);
handle.apply(this, arguments);
}
},
off: function (type, handle) {
handles = this.handles[type];
if(handles){
if(!handle){
handles.length = 0;//清空数组
}else{
for (var i = 0; i < handles.length; i++) {
var _handle = handles[i];
if(_handle === handle){
handles.splice(i,1);
}
}
}
}
}
}

var p1 = new Pubsub();
p1.on('mm', function (name) {
console.log('mm: '+ name);
});
p1.emit('mm','哈哈哈哈');

// 洋葱圈模型
// 实现方式一
function compose (middleware) {
return async function () {
let args = arguments
await dispatch(0)
function async dispatch (i) {
const fn = middleware[i]
if (!fn) return null
await fn(function next () {
dispatch(i + 1)
}, ...args)
}
}
}
// 实现方式二
function compose(middlewares=[fn1,fn2,fn3])
{
function dispatch(i)
{
let fn=middlewares[i]
if(!fn){
return Promise.resolve()
}
else
{
return new Promise((resolve)=>{
resolve(fn(function next () {
return dispatch(i + 1)
}));
});
}
}
return dispatch(0);
}

猜你喜欢

转载自www.cnblogs.com/paxster/p/12087936.html