Redux中异步action与同步action的使用

异步action

  • action:Object{} => 同步action
  • action:function() => 异步action
  同步action 异步action
类型 Object类型的对象 function()函数
dispatch(action) 同步的action被dispatch到store后;
store直接将其交给reducer加工。
异步的action函数被dispatch到store后;
store会先调用这个函数,等待异步任务结束。
     

store监测到传入的action是一个一般对象,那么store就知道这是一个同步的action,store就会把这个action交给Reducers去加工,执行。

但是store若监测到传入的action是一个函数,那么store就知道这是一个异步的action,store就会配合中间件,先调用这个函数。等到函数内的异步任务结束,再调用函数内部的同步的dispatch,再交给Reducers去加工状态。同时,store调用这个包裹着异步任务的函数时,会传入一个dispatch方法作为函数的参数,以供函数内部异步任务结束时使用这个同步的dispatch。

中间件(Middleware):redux-thunk

安装中间件:

npm install redux-thunk
// 或
yarn add redux-thunk

引入中间件:

既然中间件是配合store使用的,那么当然是在store中引入并使用这个中间件

store.js:

/*
  该文件专门用于暴露一个store对象,整个应用只有一个store对象
*/
// 引入createStore,专门用于创建redux中最为核心的store对象
import { legacy_createStore as createStore, applyMiddleware } from 'redux';
// 引入为Count组件服务的reducer
import countReducer from './count_reducer'
// 引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'
// 暴露store
export default createStore(countReducer, applyMiddleware(thunk))

代码解释:

applyMiddleware是redux中用于执行中间件的函数;

引入redux-thunk中间件;

在creaetStore时,将applyMiddleware传入作为createStore的第二个参数;

applyMiddleware本身是一个函数,用于执行中间件,所以要把(thunk)传入applyMiddleware这个函数。

applyMiddleware(thunk)含义是:执行thunk这个中间件。

这样一来,store就会在接收到一个函数类型的action时,去调用这个action对应的函数。

并且,异步action中一般都会调用同步的action,所以store在调用这个异步action对应的函数时,会传入dispatch方法作为参数,以供异步任务结束后,使用这个dispatch方法调用同步的action。

count_action_creator.js:

/*
  该文件专门为Count组件生成action动作对象
*/
import { INCREMENT, DECREMENT } from './constant'
// 同步action,就是指action的值为Object对象
export const createIncrementAction = data => ({ type: INCREMENT, data })
// ({ type: 'increment', data }) 相当于 { return { type: 'increment', data } }
export const createDecrementAction = data => ({ type: DECREMENT, data })

// 异步action,就是指action的值是函数
export const createIncrementAsyncAction = (data, time) => {
  return (dispatch) => {
    setTimeout(() => {
      dispatch(createIncrementAction(data))
    }, time)
  }
}

在Count组件中调用这个函数:

incrementAsync = () => {
  const { value } = this.selectedNumber
  store.dispatch(createIncrementAsyncAction(value * 1, 500))
}

异步action总结:

延迟的动作不想交给组件自身,想交给action时,可以使用异步的action
(但异步action并不是必须的);

何时需要异步action:
想对状态进行操作,但是具体的数据靠异步任务返回;

具体编码:

npm install redux-thunk

yarn add redux-thunk安装中间件

创建action的函数不再返回一个一般对象,而是返回一个函数,该函数中写异步任务;

异步任务有结果后,使用store传入的dispatch参数分发一个同步的action去真正操作数据

备注:异步action不是必须要写的,完全可以自己在组件中等待异步任务的结果之后再去分发同步action。

到此这篇关于Redux中异步action与同步action的使用的文章就介绍到这了,更多相关Redux 异步action与同步action内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • redux处理异步action解决方案

    如果没有中间件,store.dispatch只能接收一个普通对象作为action.在处理异步action时,我们需要在异步回调或者promise函数then内,async函数await之后dispatch. dispatch({ type:'before-load' }) fetch('http://myapi.com/${userId}').then({ response =>dispatch({ type:'load', payload:response }) }) 这样做确实可以解决问题,

  • Redux中异步action与同步action的使用

    异步action action:Object{} => 同步action action:function() => 异步action   同步action 异步action 类型 Object类型的对象 function()函数 dispatch(action) 同步的action被dispatch到store后:store直接将其交给reducer加工. 异步的action函数被dispatch到store后:store会先调用这个函数,等待异步任务结束.       store监测到传入的

  • IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI的网络库中是有同步请求的接口,所以很好处理,AFNetwork的网络库只有异步的网络请求,该怎么实现呢? 1.循环异步拼组 - (void)uploadFile:(NSArray *)imageArray atIndex:(NSInteger)index imagesCount:(NSInteger

  • jQuery中的ajax async同步和异步详解

    项目中有这样一个需求,使用ajax加载数据返回页面并赋值,然后前端取出该值 这其中涉及到代码的顺序问题,有时后台还未返回数据,但已执行后面代码, 所以就会造成取不到值 $.ajax({ type: "post", url: "admin/PfmOptionRuleItem.do", success: function(data){ $("#ruleItem").val(data.ruleItem); //① } }); return $(&quo

  • jQuery中设置form表单中action值的实现方法

    html代码: <form id="myFormId" name="myForm" action="" method="post"> <input type="hidden" id="inParam" name="inParam" /> <input type="hidden" id="tstype"

  • 解决django中form表单设置action后无法回到原页面的问题

    django中form表单设置action后,点提交按钮是跳转到action页面的,比如设置action为login,网址为192.168.1.128,跳转后便会来到192.168.1.128/login,F5刷新也会是重新提交表单对话框,无法回到原页面. 因此就要在django服务器进行重定向,具体就是 from django.shortcuts import redirect #最后返回原页面 return redirect(url) 补充知识:Django + Ajax发送POST表单,并

  • 详解Java中异步转同步的六种方法

    目录 一.问题 应用场景 二.分析 三.实现方法 1.轮询与休眠重试机制 2.wait/notify 3.Lock Condition 4.CountDownLatch 5.CyclicBarrier 6.LockSupport 一.问题 应用场景 应用中通过框架发送异步命令时,不能立刻返回命令的执行结果,而是异步返回命令的执行结果. 那么,问题来了,针对应用中这种异步调用,能不能像同步调用一样立刻获取到命令的执行结果,如何实现异步转同步? 二.分析 首先,解释下同步和异步 同步,就是发出一个调

  • React 中的 setState 是同步还是异步

    setState 是同步还是异步?肯定是异步的呀. 确定么?那看一下这段代码会打印什么: import { Component } from 'react'; class Dong extends Component { constructor() { super(); this.state = { count: 0 } } componentDidMount() { setTimeout(() => { this.setState({ count: 1 }); console.log(this

  • vue3.0中setup中异步转同步的实现

    目录 vue3 setup中异步转同步 vue3中setup前加上async后页面不显示 子组件 父组件中需要单独设置 使用vue3中的异步 vue3 setup中异步转同步 vue3中setup前加上async后页面不显示 **问题描述 **在开发 vue3 中,因为通过接口数据为异步函数获取,导致最后数据无法成功赋值进 return 中的数据.所以需要setup函数异步转同步,后设置了async 后异步转同步,结果导致页面空白不显示. 解决问题 在Vue3中,如果当前组件的setup使用了a

  • Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL

    今天在使用Navicat for mysql设计表时,在设置外键的时候,删除时和更新时两列有四个值可以选择:CASCADE.NO ACTION.RESTRICT.SET NULL,自己全亲自试了一遍,它们的区别如下: CASCADE:父表delete.update的时候,子表会delete.update掉关联记录: SET NULL:父表delete.update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null: RESTRICT:如果想要删

随机推荐