redux触发store更新,使用的dispatch(action),在关于createStore的源码解读中可以看到,store.dispatch限制了action必须是一个纯对象。是为了保持reducer的纯净性

只要传入参数相同,返回计算得到的下一个 state 就一定相同。没有特殊情况、没有副作用,没有 API 请求、没有变量修改,单纯执行计算。

redux-thunk是redux推荐的一个异步处理middleware,它可以在触发store.dispatch之前完成reducer中不能搞定的副作用,比如异步操作。

源码实现

function createThunkMiddleware(extraArgument) {
return ({ dispatch, getState }) => next => action => {
// 如果ation是函数,这调用这个函数,并且传入dispatch和getState
if (typeof action === 'function') {
// 此处的dispatch是在applyMiddleware中改写过的
return action(dispatch, getState, extraArgument);
} // 如果是对象,这调用下一个middleware
return next(action);
};
} const thunk = createThunkMiddleware(); // 返回一个middleware
// 提供原函数,可以传递额外的参数
thunk.withExtraArgument = createThunkMiddleware; export default thunk;

redux-thunk这个middleware可以接受函数类型的action,在action函数中进行各种自定义的操作(延时,接口请求等),然后再使用传入的dispatch触发实际的action动作(纯对象)。这样就不会影响reducer的纯洁性。

实例

异步的action

export function logTime (time) {
return {
type: LOG_TIME,
time
}
} export function delayLogTime () {
let now = new Date().toString();
return (dispatch) => { //可接受dispatch,getState
// 进行副作用操作
setTimeout( ()=> {
// 实际触发ation
dispatch(logTime(`${now} --- ${new Date().toString()}`))
},1000)
}
}

使用redux-thunk

import thunk from 'redux-thunk'

let store = createStore(reducer,applyMiddleware(thunk))

redux-thunk 源码学习记录的更多相关文章

  1. hashMap源码学习记录

    hashMap作为java开发面试最常考的一个题目之一,有必要花时间去阅读源码,了解底层实现原理. 首先,让我们看看hashMap这个类有哪些属性 // hashMap初始数组容量 static fi ...

  2. Tomcat源码学习记录--web服务器初步认识

    Tomcat作为开源的轻量级WEB服务器,虽然不是很适合某些大型项目,但是它开源,读其源代码可以很好的提高我们的编程功底和设计思维.Tomcat中用到了很多比较好的设计模式,其中代码风格也很值得我们去 ...

  3. java内置线程池ThreadPoolExecutor源码学习记录

    背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX ...

  4. selenium expected_conditions 源码学习记录

    #expected_conditions模块收集了一系列的场景判断方法 #源码地址 # https://seleniumhq.github.io/selenium/docs/api/py/_modul ...

  5. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  6. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  8. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  9. ddms(基于 Express 的表单管理系统)源码学习

    ddms是基于express的一个表单管理系统,今天抽时间看了下它的代码,其实算不上源码学习,只是对它其中一些小的开发技巧做一些记录,希望以后在项目开发中能够实践下. 数据层封装 模块只对外暴露mod ...

随机推荐

  1. mysql免解压版的配置

    很多朋友在安装mysq解压版l时出现: “mysql 服务无法启动 服务没报告任何错误” 以前我安装时也是遇到这样的问题: 其实mysql在5.6后就没有了data目录,很多朋友按照以前的版本安装会去 ...

  2. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  3. golang channel string 信号乱码

    原因golang代码编写是允许在同一个for select代码结构中使用相同的变量名,这样会造成运行时chan发送的内容出现乱码现象,乱码率大概在98%左右,所以这是一个坑,希望大家别重复踩坑.以下是 ...

  4. js浮点数的加减乘除

    ;(function(root, factory) { // Support AMD if (typeof define === 'function' && define.amd) { ...

  5. 20175305张天钰Java结对编程四则运算

    Java结对编程四则运算 一.题目描述:如何对表达式进行求值运算呢 1.中缀表达式与后缀表达式(娄老师讲解) 中缀表达式就是运算符号在运算数中间的表达式,比如1+2,顾名思义,后缀表达式就是运算符在运 ...

  6. 使用Anaconda虚拟环境编译caffe-gpu pycaffe

    1. 前提: 安装前服务器情况,已经安装好了: CUDNN=7.3.0 CUDA=10.0.130 Opencv 2.4.13 相应命令为: cuda 版本 cat /usr/local/cuda/v ...

  7. 记录以下docker的基本命令

    docker search xxx(tag)      在OFFICIAL上ok的是官方镜像    这里也可以去dockerhub上面看到   搜索xxx镜像docker images查看本地所安装的 ...

  8. Git 通过ssh 配置基于Host的差异配置

    Host gitlab.xxx.com HostName gitlab.xxx.com User user IdentityFile xxx\.ssh\id_rsa Host github.com H ...

  9. Java是值传递还是引用传递?

    Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...

  10. Javascript 标识符及同名标识符的优先级

    一.定义 标识符(Identifier)就是一个名字,用来对变量.函数.属性.参数进行命名,或者用做某些循环语句中的跳转位置的标记. //变量 var Identifier = 123; //属性 ( ...