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); }
念念不忘,必有回响。