Redux 洋葱模型理解

下面的代码会输出:

A middleware1 开始
C middleware2 开始
E middleware3 开始
======= G =======
F middleware3 结束
D middleware2 结束
B middleware1 结束

首先 middleware1, middleware2, middleware3 都先串联对象 middlewareAPI,

var middlewareAPI = {
  getState: store.getState,
  dispatch: (action) => dispatch(action)
}
middlewares.map(middleware => middleware(middlewareAPI));

然后内部是这样执行的 A1( A2( A3(store.dispatch) ) )( actionCreate() ),

A3的next 是store.dispatch, A2的next 是A3最里层的函数, A1的next 是A2里最里层的函数。

var A1 = function(next) {
  return function(action) {
    console.log(‘A middleware1 开始‘);
    next(action)
    console.log(‘B middleware1 结束‘);
  };
};

var A2 = function(next) {
  return function(action) {
    console.log(‘C middleware2 开始‘);
    next(action)
    console.log(‘D middleware2 结束‘);
  };
};

var A3 = function(next) {
  return function(action) {
    console.log(‘E middleware3 开始‘);
    next(action)
    console.log(‘F middleware3 结束‘);
  };
};
<!DOCTYPE html>
<html>
<head>
  <script src="//cdn.bootcss.com/redux/3.5.2/redux.min.js"></script>
</head>
<body>
<script>
function middleware1(store) {
  return function(next) {
    return function(action) {
      console.log(‘A middleware1 开始‘);
      next(action)
      console.log(‘B middleware1 结束‘);
    };
  };
}

function middleware2(store) {
  return function(next) {
    return function(action) {
      console.log(‘C middleware2 开始‘);
      next(action)
      console.log(‘D middleware2 结束‘);
    };
  };
}

function middleware3(store) {
  return function(next) {
    return function(action) {
      console.log(‘E middleware3 开始‘);
      next(action)
      console.log(‘F middleware3 结束‘);
    };
  };
}

function reducer(state, action) {
  if (action.type === ‘MIDDLEWARE_TEST‘) {
    console.log(‘======= G =======‘);
  }
  return {};
}

var store = Redux.createStore(
  reducer,
  Redux.applyMiddleware(
    middleware1,
    middleware2,
    middleware3
  )
);

store.dispatch({ type: ‘MIDDLEWARE_TEST‘ });
</script>
</body>
</html>
时间: 2024-07-30 10:19:23

Redux 洋葱模型理解的相关文章

学习笔记:Caffe上LeNet模型理解

学习笔记:Caffe上LeNet模型理解 Caffe中用的模型结构是著名的手写体识别模型LeNet-5(http://yann.lecun.com/exdb/lenet/a35.html).当年美国大多数银行就是用它来识别支票上面的手写数字的.能够达到这种商用的地步,它的准确性可想而知,唯一的区别是把其中的sigmoid激活函数换成了ReLU. 为什么换成ReLU,上一篇blog中找到了一些相关讨论,可以参考. CNN的发展,关键就在于,通过卷积(convolution http://deepl

学习笔记-CIFAR10模型理解简述

学习笔记-CIFAR10模型理解简述 整个结构中包含三个convolution layer.三个pooling layer和两个fully connected layer. 每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征,然后每个Feature Map有多个神经元. 首先是数据层,测试数据100张为一批(batch_size),后面括号内是数据总大小.如100*32*32*3= 307200 Top shape: 100 3 32 32 (30

CSS盒模型 理解

每个元素(块级和内嵌)都会有个矩形盒子,这个盒子为元素盒,盒子的中间(center)为元素的内 容,center区域内的距离为元素的高度(height).宽度(width).在盒模型中 padding就是内容 (center)与边框(border)的空隙区域,而margin 则是边框(border)外的空隙区域.元素的背景颜 色和背景图像在内边框(padding)区域是可见的,并且延生到border下面:元素的外边框(maegin)区 域总是透明的,所有父级元素的背景能看见. 盒内距离表示例如:

border,padding,margin盒模型理解

安静的敲着键盘,已势不可挡的姿势逼近php,我想我是一个幸福的人,未来不可期,做好现在,偶尔写着自己能看懂的API,慢慢悠悠的回味一下前端基础知识. 本文盒模型理解. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>border,padding,margin盒模型理解</title> <style&

全栈项目|小书架|服务器开发-Koa2中间件机制洋葱模型了解一下

KOA2 是什么? Koa是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async函数,Koa帮你丢弃回调函数,并有力地增强错误处理. Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序. 为什么产生? 笔者对这几个框架都不熟,这里就不误人子弟了.可以看看下面一些大佬的介绍. Koa是由Express的原班人马打造,那么他们为什么不将

css 盒子模型理解

盒子模型是html+css中最核心的基础知识,理解了这个重要的概念才能更好的排版,进行页面布局.下面是自己积累和总结的关于css盒子模型的知识^_^,希望对初学者有用. 一.css盒子模型概念 CSS css盒子模型 又称框模型 (Box Model) ,包含了元素内容(content).内边距(padding).边框(border).外边距(margin)几个要素.如图: 图中最内部的框是元素的实际内容,也就是元素框,紧挨着元素框外部的是内边距padding,其次是边框(border),然后最

caffe imagenet模型理解

example下imagenet文件夹下的train_caffenet.sh里面的配置文件为models/bvlc_reference_caffenet/solver.prototxt,找到了solver.prototxt,里面对应的模型为,models/bvlc_reference_caffenet/train_val.prototxt,所以本博文,主要描述的是models/bvlc_reference_caffenet/train_val.prototxt.而且从model文件夹里面可以看到

flex弹性盒模型理解

首先,flex布局的迷之属性们,如果一知半解,机械记忆的话,那不到半个月基本忘光光.先感受一下这12个flex布局属性,是不是很“迷”人. 容器属性 flex-flow flex-direction flex-wrap justify-content align-items align-content 元素属性 order flex-grow flex-shrink flex-basis flex align-self 就连老外也都在twitter吐槽不好理解,可见还是有一定的学习成本. 而目前

JVM内存模型理解

Java虚拟机(Java VirtualMachine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一. JVM内存模型 1.方法区和堆是所有线程共享的数据区 1)堆:存放对象的实例 2)方法区:存放已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码 3)运行时常量池:是方法区的一部分,存放Class的版本.字段.方法.接口等描述信息,字符串池就是这个!!! 2.程序计数器.虚拟机栈.本地方法栈是线程隔离的数据区 4)程序