Redux学习笔记--异步Action和Middleware
异步Action
之前介绍的都是同步操作,Redux通过分发action处理state,所有的数据流都是同步的,如果需要一步的话怎么办?
最简单的方式就是使用同步的方式来异步,将原来同步时一个action拆分成多个异步的action的,在异步开始前、异步请求中、异步正常返回(异常)操作分别使用同步的操作,从而模拟出一个异步操作了。
当然,这样的方式是比较麻烦的,现在已经有redux-saga等插件来解决这些问题了。。
Middleware
Middleware提供的是位于 action 被发起之后,到达 reducer 之前的扩展点。在每次分发action时,所有的Middleware都会执行。
Middleware类似spring中的面向切面编程的思想。本质上是注册一系列的操作,在分发action之前链式执行操作。
理解Middleware
尝试来解读一下middleware的实现原理。以记录日志为例,我们来一步步分析Middleware的操作。
- 首先我们能想到的就是在dispatch action的代码前后加上log的代码,但是这样的话需要在所有的dispatach语句前后加代码,太麻烦。
 - 那么我们是不是可以封装dispatch方法,将log的代码加到封装的方法里面去。但是这种情况下需要针对每个action都封装不同的方法来完成。
 - 我们也可以直接替换dispatch方法,用我们自己封装的方法来代替dispatch。这样可以解决问题,但是新的问题又出来了,假如我们在dispatch前出了log还需要做其他操作怎么办?继续去丰富我们替换的方法?好像不太合适。。。
 - 把dispatch方法看成参数
 
在上面的步骤三中,我们把原生dispat方法替换了,从而没法添加多个处理操作。那么我们是否可以把dispatch函数当成是参数,在每个处理操作函数中,除了正常的操作流程外,可以使用dispatch参数,最终仍然将此参数返回。
function logger(store) {
  return function wrapDispatchToAddLogging(next) {
    return function dispatchAndLog(action) {
      console.log('dispatching', action)
      let result = next(action)
      console.log('next state', store.getState())
      return result
    }
  }
}
es6写法
const logger = store => next => action => {
  console.log('dispatching', action)
  let result = next(action)
  console.log('next state', store.getState())
  return result
}
const crashReporter = store => next => action => {
  try {
    return next(action)
  } catch (err) {
    console.error('Caught an exception!', err)
    Raven.captureException(err, {
      extra: {
        action,
        state: store.getState()
      }
    })
    throw err
  }
}
function applyMiddleware(store, middlewares) {
  middlewares = middlewares.slice()
  middlewares.reverse()
  let dispatch = store.dispatch
  middlewares.forEach(middleware =>
    dispatch = middleware(store)(dispatch)
  )
  return Object.assign({}, store, { dispatch })
}
Redux学习笔记--异步Action和Middleware的更多相关文章
- React+Redux学习笔记:React+Redux简易开发步骤
		
前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...
 - [译]聊聊C#中的泛型的使用(新手勿入)  Seaching TreeVIew WPF  可编辑树Ztree的使用(包括对后台数据库的增删改查)  字段和属性的区别  C# 遍历Dictionary并修改其中的Value  学习笔记——异步  程序员常说的「哈希表」是个什么鬼?
		
[译]聊聊C#中的泛型的使用(新手勿入) 写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...
 - Asp.Net Core WebApi学习笔记(四)-- Middleware
		
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
 - React Redux学习笔记
		
React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...
 - 多线程编程学习笔记——异步调用WCF服务
		
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
 - Redux学习(2) ----- 异步和中间件
		
Redux中间件,其实就是一个函数, 当我们发送一个action的时候,先经过它,我们就可以对action进行处理,然后再发送action到达reducer, 改变状态,这时我们就可以在中间件中,对a ...
 - 【React全家桶入门之十三】Redux中间件与异步action
		
在上一篇中我们了解到,更新Redux中状态的流程是这种:action -> reducer -> new state. 文中也讲到.action是一个普通的javascript对象.red ...
 - 【原】redux学习笔记
		
上周学习了flux,这周研究了一下redux,其实很早之前都已经在研究他们了,只是之前一直没搞懂,最近这两周可能打通了任督二脉,都算入门了. 写博客的目的主要是做一下笔记,总结一下思路,以及和大家交流 ...
 - 网页前端状态管理库Redux学习笔记(一)
		
最近在博客园上看到关于redux的博文,于是去了解了一下. 这个Js库的思路还是很好的,禁止随意修改状态,只能通过触发事件来修改.中文文档在这里. 前面都很顺利,但是看到异步章节,感觉关于异步说得很乱 ...
 
随机推荐
- 使用 Dotfuscator 对代码进行混淆
			
Dotfuscator 简介 作为一种高级语言,c# 类库很容易被 .NET Reflector 这样的工具反编译.攻击者很容易从代码中找到数据库连接方式,加解密方法等重要信息.使用 dnspy 这样 ...
 - 深刻理解Python中的元类(metaclass)(转)
			
转载地址:http://blog.jobbole.com/21351/ 另外有几点理解记录下: 创建一个实例时,有时会传入参数,这些参数会同时传入 __init__() 和 __new__(),如: ...
 - 文献综述十七:基于 sql环境下超市管理系统的设计与实现
			
一.基本信息 标题:基于 sql环境下超市管理系统的设计与实现 时间:2018 出版源:智能计算机与应用 文件分类:uml技术的研究 二.研究背景 从超市管理系统的实际应用出发,在系统分析过程中,从功 ...
 - 3dsmax2014卸载/安装失败/如何彻底卸载清除干净3dsmax2014注册表和文件的方法
			
3dsmax2014提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2014失败提示3dsmax2014安装未完成,某些产品无法安装,也有时候想重新 ...
 - Ubuntu安装Python的mysqlclient
			
介绍 本人想在Ubuntu上开发Python程序,使用MySQL数据库. 安装环境: Ubuntu14.04 安装MySQL数据库 具体步骤如下: apt-get update apt-get ins ...
 - Java日记
			
总结关于Java web一些知识 VisualVM性能分析 —— 更好的理解JVM中的参数 JVM初始 —— 理解JVM 自己的Java开发规范 —— 个人Java开发是遵循的 ...
 - MySql的存储引擎介绍
			
下面主要介绍InnoDB.MyISAM和MEMEORY三种存储引擎. InnoDB存储引擎 InnoDB遵循CNU通用公开许可(GPL)发行.InnoDB已经被一些重量级互联网公司所采用,如雅虎.Sl ...
 - Mac OS X安装OpenGL
			
Mac OS X安装OpenGL 安装最新的cmake brew install cmake brew upgrade cmake 安装glew brew install glew 安装GLTools ...
 - bzoj 2164: 采矿
			
Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n的整数编号.为了方便起见, ...
 - jstl缺包时的报错
			
jsp中:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 报错: ...