//-----------------------------------------------------------------------------

//假设 存在一个核心操作 接收参数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中间件-洋葱模型相关推荐

  1. Egg - 中间件易错点和洋葱模型

    Egg - 中间件易错点和洋葱模型 一. 易错中间件编码 1.1 中间件和洋葱模型 一. 易错中间件编码 废话不多说,我给大家写个Demo: const auth = () => {return ...

  2. 【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 ...

  3. 东方通 中间件_东方通:中间件国产替代进程中的艰难领军者

    引言 东方通自1992年成立以来,一直深耕基础软件中间件的产品及相关技术研发,为国产中间件的开创者,连续十几年保持中间件市场占有率国内厂商第一.其时,国外的中间件也才开始起步,可以说与国际厂商站在了同 ...

  4. js reduce实现中间件_简述 laravel中间件 的原理

    laravel的middleware中间件,使用了管道(pipe). 什么是管道呢? 管道类似水净化过程中的层层过滤. 中间件的意思就是说,在接下来的逻辑之前,需要的操作. 例如江河之水我们不能直接喝 ...

  5. aspx 使用什么中间件_.NET Core中间件与依赖注入的一些思考

    点击上方蓝字"小黑在哪里"关注我吧 1.起源? 为什么会有这篇文章呢? 源于我看了老A的aspnet core 3 框架揭秘[1]请求管道 篇产生的疑惑? 三点疑惑: Single ...

  6. web中间件_常见web中间件拿shell

    1.weblogic 后台页面:(http为7001,https为7002) Google关键字:WebLogic Server AdministrationConsole inurl:console ...

  7. 多个中间件_前端如何正确使用中间件?

    简介:中间件可以算是一种前端中常用的"设计模式"了,有的时候甚至可以说,整个应用的架构都是使用中间件为基础搭建的.那么中间件有哪些利弊?什么才是中间件正确的使用姿势?本文将分享作者 ...

  8. 图解Redux中middleware的洋葱模型

    原文发布于我的 GitHub 博客,欢迎 star ? 前言 最近翻出了之前分析的 applyMiddleware 发现自己又看不懂了?,重新看了一遍源代码,梳理了洋葱模型的实现方法,在这里分享一下. ...

  9. redux引用多个中间件_如何轻松创建您的第一个Redux中间件

    redux引用多个中间件 by Gabriele Cimato 加布里埃莱·西马托(Gabriele Cimato) 如何轻松创建您的第一个Redux中间件 (How to create your f ...

最新文章

  1. 【Design pattern】设计模式思路总结(三)
  2. 江行智能CTO樊小毅:AI+边缘计算驱动能源产业变革 | 量子位·视点分享回顾
  3. 一文弄懂SSD目标检测算法
  4. Python接口自动化实战 ( 第一阶段) - 封装接口请求类和异常处理
  5. matlab 不同长度的向量放入一个矩阵,Matlab:将不同长度的行叠加到矩阵上
  6. 洛谷2014 选课(树形DP)树形背包问题
  7. 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)
  8. 接口测试用例设计 - 精简版
  9. Java类和对象(重点详解)
  10. 软件测试培训到底值不值得参加?
  11. 【Redis】模拟手机验证码案例:Jedis使用、get、hget、hincrBy、setex、生成6位随机数工具
  12. 函数信号发生器的设计与实现_北邮大二上电子电路基础实验报告
  13. 英特尔的指令集体系结构_VLIW指令集架构 cpu指令集跟架构的区别
  14. 欣赏的心态去发现生活中的美
  15. 阿里云ESC搭建SVN服务端-----实测有效,并补充了一些坑点
  16. 数据库系统概念 - 数据模型,关系模型,关系,候选码,主码,外码
  17. 2021-6-10-今日收获
  18. php导入excel 进度条,.NET_进度条在.net导入Excel时的应用实例,本文实例讲述了进度条在.net导 - phpStudy...
  19. 基因组选择中的参考群更新策略
  20. 疫情对广州房价的影响

热门文章

  1. apache camel 相关配置_MyBatis-Plus返回map自动转驼峰配置object-wrapper-factory
  2. 每日程序C语言29-将数组逆序输出
  3. python用户界面导入图片_python学习笔记之11:图像用户界面
  4. Java黑皮书课后题第9章:*9.5(使用GregorianCalendar类)Java API中有一个位于包java.util中的类GregorianCalendar
  5. Java黑皮书课后题第9章:*9.4(使用Random类)编写一个程序,创建一个种子为1000的Random对象,然后使用nextInt(100)方法显示0到100之间的前50个随机整数
  6. Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
  7. 树的先序遍历的栈实现
  8. css实现垂直居中定位
  9. Linux网络协议栈(四)——链路层(2)
  10. 海洋工作室——网站建设专家:How to check the SQL statement execute time on SQL Server ?...