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 form action动态修改方法
Nov 04 Javascript
jQuery 白痴级入门教程
Nov 11 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
Oct 20 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
使用vue-resource进行数据交互的实例
Sep 02 Javascript
vue 子组件向父组件传值方法
Feb 26 Javascript
vue代理和跨域问题的解决
Jul 18 Javascript
Vue如何提升首屏加载速度实例解析
Jun 25 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
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
php 短链接算法收集与分析
2011/12/30 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中暂存上传图片的方法
2015/02/18 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
pandas值替换方法
2018/07/10 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
python中threading开启关闭线程操作
2020/05/02 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
古驰英国官网:GUCCI英国
2020/03/07 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
小学优秀教师材料
2014/12/15 职场文书
后进生评语大全
2015/01/04 职场文书
单位接收函范文
2015/01/30 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
运动会广播稿20字
2015/08/19 职场文书