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 相关文章推荐
JavaScript Date对象 日期获取函数
Dec 19 Javascript
一些有用的JavaScript和jQuery的片段分享
Aug 23 Javascript
文本框获得焦点和失去焦点的判断代码
Mar 18 Javascript
js事件(Event)知识整理
Oct 11 Javascript
js使用正则实现ReplaceAll全部替换的方法
Aug 22 Javascript
JavaScript驾驭网页-获取网页元素
Mar 24 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
Jun 08 Javascript
jQuery实现广告条滚动效果
Aug 22 jQuery
angularjs实现时间轴效果的示例代码
Nov 29 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 Javascript
jQuery实现消息弹出框效果
Dec 10 jQuery
vue的$http的get请求要加上params操作
Nov 12 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
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
详解js中==与===的区别
2017/01/08 Javascript
babel基本使用详解
2017/02/17 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
详解Python文本操作相关模块
2017/06/22 Python
django中静态文件配置static的方法
2018/05/20 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
Linux上比较文件的命令都有哪些
2012/02/24 面试题
标准导师推荐信(医学类)
2013/10/28 职场文书
应聘自荐信
2013/12/14 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
生物制药专业求职信
2014/03/11 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
就业协议书怎么填
2014/09/15 职场文书
教师批评与自我批评
2014/10/15 职场文书
计算机实训报告范文
2014/11/05 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python