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 相关文章推荐
jquery 入门教程 [翻译] 推荐
Aug 17 Javascript
Javascript堆排序算法详解
Dec 03 Javascript
JavaSacript中charCodeAt()方法的使用详解
Jun 05 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
Jan 27 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
基于 Vue 的树形选择组件的示例代码
Aug 18 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
Aug 22 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
Feb 24 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 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
德生PL330的评价与改造
2021/03/02 无线电
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
提高php编程效率技巧
2015/08/13 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
python如何查看网页代码
2020/06/07 Python
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
一封普通求职者的求职信
2013/11/20 职场文书
校园安全演讲稿
2014/05/09 职场文书
授权委托书格式
2014/07/31 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书