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 data()如何存值
Aug 18 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
Dec 03 Javascript
Backbone View 之间通信的三种方式
Aug 09 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
vue首次赋值不触发watch的解决方法
Sep 11 Javascript
微信小程序实现点赞、取消点赞功能
Nov 02 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
Jan 08 jQuery
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
Aug 27 Javascript
ES2020 已定稿,真实场景案例分析
May 25 Javascript
Vue常用API、高级API的相关总结
Feb 02 Vue.js
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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
探矿工程师自荐信
2014/01/24 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书