博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写一个简易中间件
阅读量:6945 次
发布时间:2019-06-27

本文共 1913 字,大约阅读时间需要 6 分钟。

目的

解决项目中代码耦合度比较高,可以随时对业务部分代码进行插拔。

API 设计

applyMiddleWare(middleWares) //middleWares 传入的中间件

返回值 fn //fn 为启动中间件的方法

支持复合调用 applyMiddleWare(middleWare1, applyMiddleWare(middleWares), .....)

实现

我们假定有三个中间件:add, substract, multiply

顺序是 add -> substract -> multiply

单个中间件的设计是:

function MiddleWare(next) => {    return function(str){        next(str)    }    }复制代码

next为下一个启动中间件的方法,思路其实很简单,就是把multiply 的 里面一层即 function(str){ next() } 这一层作为substract 的next,再依次往上挂,所以我们可以写下如下代码

function applyMiddleWare(middleWares){        var next = function(str){            return str;        };        middleWares = middleWares.reverse();        for(var i=0; i

至于最里面的那一层没有next,我们又是从后往前遍历中间件,所以入口的next 返一个 var next = function(str){ return str;}这个就好了,把处理的结果抛上去。

至于middleware复合的情况会有一点复杂,我们举个例子: applyMiddleWare(middleWare1, applyMiddleWare(middleWares)) middleWare1 的结构是 (next) => (str) => {}, applyMiddleWare(middleWares)的结构是 (str) => {}。我比较偷懒,打算把所有的组合都作为普通中间件,这里用了一个contents记录组合的中间件的,例如:

var start = applyMiddleWare(middleWares1, middleWares2, middleWares3);

那么start的contents 就是[middleWares1, middleWares2, middleWares3],对于组合和非组合的用content字段区别,统一展开,类似数组展平,具体实现如下:

function add(next){    return function (str){          console.log('add中间件before(准备+2):', str);          str += 2;        str = next(str);        console.log('add中间件after:', str);          return str;    }}function subtract(next){    return function(str){        console.log('subtract中间件before(准备-1):', str);          str -= 1;        str = next(str);        console.log('subtract中间件after:', str);        return str;      }}function multiply(next){    return function(str){        console.log('multiply中间件before(准备*2):', str);          str *= 2;        str = next(str);        console.log('multiply中间件after:', str);         return str;     }}function flattenMiddleWare(middleWares){    var _array = [];    for(var i=0; i

结果

转载于:https://juejin.im/post/5bc85104e51d450e5a74738c

你可能感兴趣的文章
安装CocoaPods无限卡在Setting up CocoaPods master repo
查看>>
TensorFlow官方文档学习02-MNIST初级课程
查看>>
像调试java一样来调试Redis lua
查看>>
漫长“支付路”,BCH与你一路同行
查看>>
使用axure动态面板制作轮播图效果
查看>>
我的友情链接
查看>>
将一个驱动器下的所有文件的属性设置为非隐藏
查看>>
出现次数最多的k个数 Top K Frequent Words
查看>>
spark2.2官方教程笔记-spark编程向导
查看>>
U盘安装CentOS6.x和Redhat6.x及以下版本
查看>>
我的友情链接
查看>>
vsftp 配置参数说明
查看>>
phpcms2008index.html当前位置导航phpcms全局变量搜索模块
查看>>
TangYuan使用教程-组合SQL服务标签
查看>>
Mac OS X下安装pyenv
查看>>
CentOS6.x 下 LNMP环境搭建(一、安装 MySQL)
查看>>
DNS中的递归查询与迭代查询
查看>>
NFS详解
查看>>
下载中心常见问题解答【Q&A帮助】
查看>>
教你怎么追一个女孩子,哥认为很有道理。
查看>>