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代码
Dec 10 Javascript
js中数组排序sort方法的原理分析
Nov 20 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
javascript简单判断输入内容是否合法的方法
May 11 Javascript
JavaScript知识点总结(十)之this关键字
May 31 Javascript
AngularJS入门教程之AngularJS 模板
Aug 18 Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 Javascript
jquery submit()不能提交表单的解决方法
Apr 24 jQuery
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
Aug 08 Javascript
vue-cli 构建骨架屏的方法示例
Nov 08 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 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 array_search() 函数使用
2010/04/13 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
Vue实现简单分页器
2018/12/29 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
饭店工作计划书
2014/01/10 职场文书
学生宿舍管理制度
2014/01/30 职场文书
教师职位说明书
2014/07/29 职场文书
保外就医申请书范文
2015/08/06 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS