JS中间件设计模式的深入探讨与实例分析


Posted in Javascript onApril 11, 2020

本文实例讲述了JS中间件设计模式。分享给大家供大家参考,具体如下:

中间件作为一些辅助处理功能,应用非常广泛,例如express中间件,redux中间件,koa中间件,那么中间件的设计模式到底是怎样的呢。结合中间件的使用实例探讨和总结一下中间件的设计思想和一般实现模式。

仿照redux中间件实现模式,看如下一个例子:

function fn2(next){
  console.log('执行2,返回改造的next之前')
  return action => {
    console.log('执行2')
    next(action)
  }
}
function fn3(next){
  console.log('执行3,返回改造的next之前')
  return action => {
    console.log('执行3')
    next(action)
  }
}
function fn1(next){
  console.log('执行1,返回改造的next之前')
  return action => {
    console.log('执行1')
    getData().then( data => {
      next(action)
    })
  }
  
}
 
function getData(){
  return new Promise(resolve => {
    setTimeout( () => {
      resolve(true)
    },3000)
  })
}
const next = (action) => {
  console.log('action',action)
}
// compose([fn1,fn2,fn3])(next)
const mm = [fn1,fn2,fn3].reduce(function(a,b,currentIndex,arr){
  console.log("a",a)
  console.log("b",b)
  return function(...args){
    console.log('args',[...args][0].toString())
    return a(b(...args))
  }
})(next)(1)

运行结果:这里类似与洋葱圈模型,但是是先从里向外,再由外向里

执行3,返回改造的next之前
args action => {
        console.log('执行3')
        next(action)
    }
执行2,返回改造的next之前
执行1,返回改造的next之前
执行1
执行2
执行3
action 1

接下来对上面的实例进行简化:

function fn2(action){
  console.log('执行2,返回改造的next之前')
  action+2
}
function fn3(action){
  console.log('执行3,返回改造的next之前')
  action+1
}
function fn1(action){
  console.log('执行1,返回改造的next之前')
  return action+1
  
}
 
function getData(){
  return new Promise(resolve => {
    setTimeout( () => {
      resolve(true)
    },3000)
  })
}
const next = (action) => {
  console.log('action',action)
}
// compose([fn1,fn2,fn3])(next)
const mm = [fn1,fn2,fn3].reduce(function(a,b,currentIndex,arr){
  console.log("a",a)
  console.log("b",b)
  return function(...args){
    console.log('args',[...args])
    return a(b(...args))
  }
})(1)

这时的中间件只是一层处理逻辑,没有传递初始处理逻辑,所以中间件是单一的,运行结果:

args [ 1 ]
执行3,返回改造的next之前
args [ undefined ]
执行2,返回改造的next之前
执行1,返回改造的next之前

抽离通用逻辑,深入到本质,中间件是对最初处理逻辑函数进行改造,如果没有,只执行自身的逻辑。

1,上面比较单一的就是只有自身逻辑的中间件

2,具有初始处理逻辑函数next的中间件,需要接受next,返回一个新的next'

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS的数组的扩展实例代码
Jul 09 Javascript
js中if语句的几种优化代码写法
Mar 12 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
Jul 21 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
Jun 19 Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 Javascript
javascript动画之模拟拖拽效果篇
Sep 26 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
vue自动化表单实例分析
May 06 Javascript
JavaScript刷新页面的几种方法总结
Mar 28 Javascript
vue实现多条件和模糊搜索功能
May 28 Javascript
JS实现移动端在线签协议功能
Aug 22 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
Apr 11 #Javascript
js函数柯里化的方法和作用实例分析
Apr 11 #Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
Apr 11 #Javascript
JavaScript运行机制实例分析
Apr 11 #Javascript
js中调用微信的扫描二维码功能的实现代码
Apr 11 #Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
Apr 11 #Javascript
微信分享invalid signature签名错误踩过的坑
Apr 11 #Javascript
You might like
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
jquery蒙版控件实现代码
2010/12/08 Javascript
js图片处理示例代码
2014/05/12 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python Trie树实现字典排序
2014/03/28 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
python实现静态web服务器
2019/09/03 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
Python打印不合法的文件名
2020/07/31 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
公司财务工作总结的自我评价
2013/11/23 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
室内拓展活动方案
2014/02/13 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
导游词之南京中山陵
2019/11/27 职场文书