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 相关文章推荐
新浪微博字数统计 textarea字数统计实现代码
Aug 28 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
搞定immutable.js详细说明
May 02 Javascript
Javascript实现运算符重载详解
Apr 07 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
Jan 08 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 Javascript
js实现ajax的用户简单登入功能
Jun 18 Javascript
vue实现登陆页面开发实践
May 30 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
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php生成短域名函数
2015/03/23 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
Jquery attr("checked") 返回checked或undefined 获取选中失效
2013/10/10 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
python计算书页码的统计数字问题实例
2014/09/26 Python
python常用函数与用法示例
2019/07/02 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
python常用排序算法的实现代码
2019/11/08 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python 如何上传包到pypi
2020/12/24 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
长青弘远的面试题
2012/06/09 面试题
Servlet如何得到服务器的信息
2015/12/22 面试题
高分子材料个人求职信范文
2013/09/25 职场文书
小学运动会演讲稿
2014/08/25 职场文书
面试通知单大全
2015/04/20 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
责任书格式
2019/04/18 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL