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 自定义的联动下拉框
Feb 07 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
javascript仿php的print_r函数输出json数据
Sep 13 Javascript
js、css、img等浏览器缓存问题的2种解决方案
Oct 23 Javascript
javascript实现画不相交的圆
Apr 07 Javascript
jQuery选择器用法实例详解
Dec 17 Javascript
jQuery toggle 代替方法
Mar 22 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
Jan 23 Javascript
Three.js中网格对象MESH的属性与方法详解
Sep 27 Javascript
Angular利用HTTP POST下载流文件的步骤记录
Jul 26 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
Aug 07 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后退一页表单内容保存实现方法
2012/06/17 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
js类 from qq
2006/11/13 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
WebPack基础知识详解
2017/01/16 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python实现视频下载功能
2017/03/14 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
盛大二次面试题
2016/11/18 面试题
商务日语毕业生自荐信
2013/11/23 职场文书
幼儿园新年寄语
2014/04/03 职场文书
安全责任协议书
2014/04/21 职场文书
阳光体育活动总结
2014/04/30 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
中秋节随笔
2015/08/15 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
python画条形图的具体代码
2022/04/20 Python