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 相关文章推荐
建立良好体验度的Web注册系统ajax
Jul 09 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
IE与FireFox中的childNodes区别
Oct 20 Javascript
js 字符串转换成数字的三种方法
Mar 23 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
Nov 10 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 Javascript
Three.js学习之网格
Aug 10 Javascript
bootstrap table表格插件使用详解
May 08 Javascript
vue使用keep-alive实现数据缓存不刷新
Oct 21 Javascript
Echarts之悬浮框中的数据排序问题
Nov 08 Javascript
JS回调函数深入理解
Oct 16 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
php源码的使用方法讲解
2019/09/26 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
javascript 异常处理使用总结
2009/06/21 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
三种取消选中单选框radio的方法
2014/09/09 Javascript
JavaScript使用Prototype实现面向对象的方法
2015/04/14 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
js实现网页收藏功能
2015/12/17 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
2020/11/06 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
详解Django中的form库的使用
2015/07/18 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
python实现电子词典
2020/03/03 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
自我评价怎么写好呢?
2013/12/05 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
园林技术专业求职信
2014/07/28 职场文书
2015年统战工作总结
2015/05/19 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python