当前位置: 首页 > news >正文

Redux中同步 action 与异步 action 最大的区别是什么

区别
react 负责页面展示,redux 负责用来处理数据。

按照这个思路,异步获取到的数据应该也归redux管理。
所以对于react来说,只要发起一个dispatch告诉redux去处理异步,把获取到的数据存到store里面,在界面需要的时候,直接能取出来用就可以了,界面再也不用担心异步回调事件。

所以一般用了redux就会配合使用redux-thunk。 来异处理数据的存储。

每当 dispatch action 时,state 会被立即更新。但是实际应用中,我们有很多操作执行后,过一段时间,才会得到结果。那么怎么处理这种情况呢?

先熟悉一个概念:中间件

在store.dispatch(action) 执行时候,打印日志,这就是一个简单的中间件

let next = store.dispatch;
store.dispatch = action => {
  next(action);
  console.log('state after dispatch', getState())
}

引入中间件 redux-thunk
redux-thunk中间件,允许action creator返回一个函数,这个函数会接收dispath和getState?为参数

看下面三种不同的action

const INCREMENT_COUNTER = 'INCREMENT_COUNTER';

普通的,返回一个对象
function increment() {
  return {
    type: INCREMENT_COUNTER
  };
}

异步的,返回一个函数

function incrementAsync() {
  return dispatch => {
    setTimeout(() => {
      // Yay! Can invoke sync or async actions with `dispatch`
      dispatch(increment());
    }, 1000);
  };
}

带条件的,返回一个函数

function incrementIfOdd() {
  return (dispatch, getState) => {
    const { counter } = getState();
    if (counter % 2 === 0) {
      return;
    }
    dispatch(increment());
  };
}

使用中间件 redux-thunk
需求:进入页面之后,点击某个按钮,获取用户投资总额。。。

分析:
异步请求有3个关键action

开始请求–一般用于呈现加载进度条
请求成功–关闭进度条,加载数据
请求失败–关闭进度条,展示错误信息
代码如下,参考一哈:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk'; //导入thunk
import rootReducer from './reducers/index';

// Note: this API requires redux@>=3.1.0
const store = createStore(
  rootReducer,
  applyMiddleware(thunk)//激活thunk中间件
);

//一个异步请求
function fetchAmount() {
  return fetch('https://www.renrendai.com/getAmount?userId=123')
}
//通知 reducer 请求开始的 action
requestPost(){
    return{
        type: REQUEST_POSTS,
        isFetch:true //进度条相关
    }
}

//通知 reducer 请求成功的 action
receviePostOnSuccess( data){
    return{
         type: RECEIVE_POSTS,
         isFetch:false,
         amount: data.amount
     }
}
//通知 reducer 请求失败的 action。
receviePostOnError( message){
  return{
     type: RECEIVE_POSTS,
     isFetch:false,
     errorMsg:message
  }
}


//异步请求action 【将上面3个基础的action整合】
function getAmount(){
    retrun (dispath)=>{
    // 首次 dispatch:更新应用的 state 来通知API 请求发起了
    dispatch(requestPosts())
    //异步请求后端接口
        return fetchAmount().then(
             data=>dispath(receviePostOnSuccess(data)),
             error=> dispatch(receviePostOnError('error))
        )
    }
}

相关文章:

  • setTimeout和setInterval的区别
  • shell脚本编程
  • 数组常用的处理方法 map,forEach,filter, every,some, set, concat, find 等
  • 阿里云自定义监控配置实例
  • Import 和 link引入的区别
  • 菜鸟如何才能快速提高自己的编程技术
  • css使子元素在父元素居中的各种方法/ 子元素居中有哪些方案
  • display:inline-block的用法
  • IE盒模型和W3C盒模型有什么不同?
  • 400多万微信用户如何“变现”?凯叔说了五大秘诀与教训
  • 分别封装添加事件和移除事件的函数,用以解决兼容性问题
  • 缓存、加载、检查、状态
  • 写一个function,清除字符串前后的空格
  • ado 小测试
  • 经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ?
  • [译]Python中的类属性与实例属性的区别
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • js算法-归并排序(merge_sort)
  • k8s 面向应用开发者的基础命令
  • leetcode讲解--894. All Possible Full Binary Trees
  • React组件设计模式(一)
  • ucore操作系统实验笔记 - 重新理解中断
  • windows下使用nginx调试简介
  • zookeeper系列(七)实战分布式命名服务
  • 编写高质量JavaScript代码之并发
  • 将 Measurements 和 Units 应用到物理学
  • 设计模式(12)迭代器模式(讲解+应用)
  • 实现菜单下拉伸展折叠效果demo
  • 双管齐下,VMware的容器新战略
  • 学习Vue.js的五个小例子
  • 与 ConTeXt MkIV 官方文档的接驳
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • (C++17) std算法之执行策略 execution
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (四)Linux Shell编程——输入输出重定向
  • (一)Java算法:二分查找
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .Net core 6.0 升8.0
  • .NET 设计一套高性能的弱事件机制
  • /var/spool/postfix/maildrop 下有大量文件
  • :not(:first-child)和:not(:last-child)的用法
  • @Data注解的作用
  • [ SNOI 2013 ] Quare
  • []串口通信 零星笔记
  • [Android]使用Git将项目提交到GitHub
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [C#][DevPress]事件委托的使用
  • [C++][基础]1_变量、常量和基本类型
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?
  • [Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例
  • [Machine Learning][Part 8]神经网络的学习训练过程
  • [PAT练级笔记] 34 Basic Level 1034 有理数四则运算