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中全局对象的isNaN()方法使用介绍
Dec 19 Javascript
javascript将异步校验表单改写为同步表单
Jan 27 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
实例解析jQuery中如何取消后续执行内容
Dec 01 Javascript
Bootstrap导航条学习使用(二)
Feb 08 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 Javascript
深入学习JavaScript 高阶函数
Jun 11 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
Sep 03 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
Mar 02 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 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
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Python利用Django如何写restful api接口详解
2018/06/08 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Python列表操作方法详解
2020/02/09 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
关于迟到的检讨书
2014/01/26 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
民事赔偿协议书
2014/11/02 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
被告代理词范文
2015/05/25 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python