js reduce实现中间件_实现redux中间件-洋葱模型
//-----------------------------------------------------------------------------
//假设 存在一个核心操作 接收参数coreArg
//建立洋葱模型,包裹N层中间件
//要求:
// 在核心代码执行执之前必须要有序执行中间件
// 核心代码执行后层层返回
// 每个中间件都能接收到coreArg
function receiveMiddleware () {
//拿到中间件队列
let middlewareList = Array.prototype.slice.call(arguments);
//将中间件队列改造为函数层层嵌套形式
//[a,b,c,d] => a(b(c(d(core)))) By reduce
let tiggerPip = middlewareList.reduce((a, b) => (core) => a(b(core)));
let tiggerPipWitchCoreHandler = tiggerPip(() => { console.log('我是核心操作') });
return tiggerPipWitchCoreHandler;
}
const middleware1 = (next) => (lastMDarg) => {
console.log('lm 1 start')
next(lastMDarg);
console.log('lm 1 end')
};
const middleware2 = (next) => (lastMDarg) => {
console.log('lm 2 start')
next(lastMDarg);
console.log('lm 2 end')
};
const middleware3 = (next) => (lastMDarg) => {
console.log('lm 3 start')
next(lastMDarg);
console.log('lm 3 end')
};
let dispatch = receiveMiddleware(middleware1, middleware2, middleware3);
dispatch({ type: 'fff' });
//-----------------------------------------------------------------------------
//增加异步操作
const store = {
status: {name: 'zhangsan'},
getState: () => { return this.status },
dispatch: (arg) => {console.log(`我是核心操作,参数=${arg}`)}
};
function receiveMiddleware () {
//拿到中间件队列
let middlewareList = Array.prototype.slice.call(arguments);
let dispatch = store.dispatch;
let middlewareAPI = {
dispatch: (arg) => { dispatch(arg) },
getState: store.getState,
};
//判断中间件数量
if (middlewareList.length === 0) { return dispatch }
//将核心操作当作参数赋予每个中间件
middlewareList = middlewareList.map((middleware) => middleware(middlewareAPI));
//将中间件队列改造为函数层层嵌套形式
//[a,b,c,d] => a(b(c(d(core)))) By reduce
let tiggerPip = middlewareList.reduce((a, b) => (reallyDispatch) => a(b(reallyDispatch)));
//重写dispatch
dispatch = tiggerPip(store.dispatch);
return dispatch;
}
const middleware1 = (middlewareAPI) => (next) => (lastMDarg) => {
console.log('lm 1 start')
next(lastMDarg);
console.log('lm 1 end')
};
const middleware2 = (middlewareAPI) => (next) => (lastMDarg) => {
console.log('lm 2 start')
next(lastMDarg);
console.log('lm 2 end')
};
const middleware3 = (middlewareAPI) => (next) => (lastMDarg) => {
console.log('lm 3 start')
next(lastMDarg);
console.log('lm 3 end')
};
const supportAsyncMiddleware = (middlewareAPI) => (next) => (lastMDarg) => {
console.log('lm supportAsyncMiddleware start')
if (typeof lastMDarg === 'function') {
lastMDarg(middlewareAPI)
} else {
next(lastMDarg);
console.log('lm supportAsyncMiddleware end')
}
};
let dispatch = receiveMiddleware(middleware1,
middleware2,
middleware3,
supportAsyncMiddleware);
let asyncFun = (middlewareAPI) => {
setTimeout(() => {
let mockGetData = 'im mock data'
middlewareAPI.dispatch(mockGetData)
console.log(middlewareAPI.getState())
}, 3000)
}
dispatch(asyncFun)
js reduce实现中间件_实现redux中间件-洋葱模型相关推荐
- Egg - 中间件易错点和洋葱模型
Egg - 中间件易错点和洋葱模型 一. 易错中间件编码 1.1 中间件和洋葱模型 一. 易错中间件编码 废话不多说,我给大家写个Demo: const auth = () => {return ...
- 【NodeJS】关于Node.js Web框架Koa的中间件编写以及如何理解洋葱模型
文章目录 Koa入门 1.1 中间件的使用 1.2 路由该怎么写 1.2.1 原生路由 1.2.2 利用koa-router中间件实现 1.2.3 文件路径匹配路由 1.3 静态服务器 1.3.1 k ...
- 东方通 中间件_东方通:中间件国产替代进程中的艰难领军者
引言 东方通自1992年成立以来,一直深耕基础软件中间件的产品及相关技术研发,为国产中间件的开创者,连续十几年保持中间件市场占有率国内厂商第一.其时,国外的中间件也才开始起步,可以说与国际厂商站在了同 ...
- js reduce实现中间件_简述 laravel中间件 的原理
laravel的middleware中间件,使用了管道(pipe). 什么是管道呢? 管道类似水净化过程中的层层过滤. 中间件的意思就是说,在接下来的逻辑之前,需要的操作. 例如江河之水我们不能直接喝 ...
- aspx 使用什么中间件_.NET Core中间件与依赖注入的一些思考
点击上方蓝字"小黑在哪里"关注我吧 1.起源? 为什么会有这篇文章呢? 源于我看了老A的aspnet core 3 框架揭秘[1]请求管道 篇产生的疑惑? 三点疑惑: Single ...
- web中间件_常见web中间件拿shell
1.weblogic 后台页面:(http为7001,https为7002) Google关键字:WebLogic Server AdministrationConsole inurl:console ...
- 多个中间件_前端如何正确使用中间件?
简介:中间件可以算是一种前端中常用的"设计模式"了,有的时候甚至可以说,整个应用的架构都是使用中间件为基础搭建的.那么中间件有哪些利弊?什么才是中间件正确的使用姿势?本文将分享作者 ...
- 图解Redux中middleware的洋葱模型
原文发布于我的 GitHub 博客,欢迎 star ? 前言 最近翻出了之前分析的 applyMiddleware 发现自己又看不懂了?,重新看了一遍源代码,梳理了洋葱模型的实现方法,在这里分享一下. ...
- redux引用多个中间件_如何轻松创建您的第一个Redux中间件
redux引用多个中间件 by Gabriele Cimato 加布里埃莱·西马托(Gabriele Cimato) 如何轻松创建您的第一个Redux中间件 (How to create your f ...
最新文章
- 【Design pattern】设计模式思路总结(三)
- 江行智能CTO樊小毅:AI+边缘计算驱动能源产业变革 | 量子位·视点分享回顾
- 一文弄懂SSD目标检测算法
- Python接口自动化实战 ( 第一阶段) - 封装接口请求类和异常处理
- matlab 不同长度的向量放入一个矩阵,Matlab:将不同长度的行叠加到矩阵上
- 洛谷2014 选课(树形DP)树形背包问题
- 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)
- 接口测试用例设计 - 精简版
- Java类和对象(重点详解)
- 软件测试培训到底值不值得参加?
- 【Redis】模拟手机验证码案例:Jedis使用、get、hget、hincrBy、setex、生成6位随机数工具
- 函数信号发生器的设计与实现_北邮大二上电子电路基础实验报告
- 英特尔的指令集体系结构_VLIW指令集架构 cpu指令集跟架构的区别
- 欣赏的心态去发现生活中的美
- 阿里云ESC搭建SVN服务端-----实测有效,并补充了一些坑点
- 数据库系统概念 - 数据模型,关系模型,关系,候选码,主码,外码
- 2021-6-10-今日收获
- php导入excel 进度条,.NET_进度条在.net导入Excel时的应用实例,本文实例讲述了进度条在.net导 - phpStudy...
- 基因组选择中的参考群更新策略
- 疫情对广州房价的影响
热门文章
- apache camel 相关配置_MyBatis-Plus返回map自动转驼峰配置object-wrapper-factory
- 每日程序C语言29-将数组逆序输出
- python用户界面导入图片_python学习笔记之11:图像用户界面
- Java黑皮书课后题第9章:*9.5(使用GregorianCalendar类)Java API中有一个位于包java.util中的类GregorianCalendar
- Java黑皮书课后题第9章:*9.4(使用Random类)编写一个程序,创建一个种子为1000的Random对象,然后使用nextInt(100)方法显示0到100之间的前50个随机整数
- Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
- 树的先序遍历的栈实现
- css实现垂直居中定位
- Linux网络协议栈(四)——链路层(2)
- 海洋工作室——网站建设专家:How to check the SQL statement execute time on SQL Server ?...