Redux 异步解决方案2. Redux-Saga中间件

news2024/11/18 9:24:52

利用Generator特性实现异步

因为Generator。结合yield yield操作符会获取右边表达示的值返回 可以用于异步变同步操作
中间件的特性: 以前的 action -> reducers -> store
现在的 action -> middleware -> reducers -> store

注意:

reducer的type 不能和generator的名字一样。否则会出现惊喜     
call generator 只能接受到返回值      

redux-saga初使用

安装: yarn add redux-saga

  • store.js
import { createStore, combineReducers, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import createSagaMiddleware from 'redux-saga';  // 导入创建saga的函数
import {add, deleter} from './Reducers/TodoList';
import {watch} from './Saga/saga';

// 返回一个saga中间件
const sagaMiddleware = createSagaMiddleware();

export default createStore(
    combineReducers({add, deleter}),
    applyMiddleware(sagaMiddleware)
);

// saga进行监听 传入的必须是一个generator
sagaMiddleware.run(watch);
  • Saga/saga.js
import {
    call,  // 调用一个函数
    put,
    take,
    select, // 查询store的状态
    takeEvery // 对action进行监听
} from 'redux-saga/effects';


export function* fetchData() {
// 利用generator + yield 同步进行数据处理
    const data = yield fetch("http://jsonplaceholder.typicode.com/posts")
    const res = yield data.json();
    
    // put这个函数相当于正常的dispatch分发一个action给reducer
    yield put({
        type: 'getList',
        payload: res
    })
}


// 对dispatch过来的action 进行监听 如果监听到的action type等 takeEvery的第一个参数则触发 fetchData这个函数
export function* watch() {
    yield takeEvery('fetchData', fetchData);
}

正常使用dispatch分发action

sagaClick = () => {
    this.props.dispatch({
        type: 'fetchData'
    });
};

首先 dispatch -> action 如果type是saga监听的那个type 则运行流程为: 
dispatch -> action -> watch -> fetchData -> reducer -> store

如果没有和saga的type对应上 会自己分发到reducer,和以前流程保持不变

实现效果 点击sagaClick获取数据 展示到页面上:

saga示例

  • saga常用API
  1. takeEvery(“actionType”, generator).
    解释: 监听actionType 将action分发给generator 可以传递一个通配符*监听所有的action
  2. takeLatest(“actionType”, generator)
    解释: 类似防抖 只会有一个任务 会自动取消前一个任务
  3. take
    解释: take函数可以理解成为监听未来的action 告诉middleware等待第一个action Generator会暂停 直到action匹配成功 才会执行之后的语句 也就是说take是一个阻塞的effect
  4. fork
    解释: fork和call函数类似 但是fork是非阻塞函数 不会等待执行
  5. put
    解释: put函数相当于redux的dispatch 当put一个action后。reducer中就会计算新的state并返回 注意: put也是阻塞effect
  6. call
    解释: call函数 调用其他函数 调用的函数可以是Generator 或者是返回一个promise的简单函数 call函数页数阻塞effect
  7. select
    解释: select函数是用来指示middleware调用提供的选择器获取Store上的state 类似于redux: store.getState().
    yield select(state => state.getTodoList.list) 可以通过函数返回值更改值
  8. all
    解释: yield all([call(1), call(2)]) 相当于promise.all
  9. race
    解释: yield race({post: call(1), timeout: call(2)}) 谁先返回谁先有值
  10. cancel
    解释: fork产生的任务 可以使用cancel取消任务

参考来源:憧憬在 aoppp.com发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

群晖云同步失败?一直卡在连接中怎么办?

群晖云同步是群晖NAS的一款基于网络的数据备份和同步服务,它可以帮助我们在不同设备之间轻松地同步文件、照片、文档等,并且支持自动化执行同步备份任务,让您的数据存储更加安全。 虽然群晖云同步能给我们带来很多便利,但是在…

yolov5 6.1 关于 tensorrt 加速的使用以及问题说明

文章目录 1. 参考连接2. 使用说明2.1 导出加速模型2.1 使用加速模型2.2 加速参数对比 3. 问题说明3.1 在 Tensorrt 8.4.1.5 版本上使用 export.py 导出失败的问题3.2 把模型文件由 best.pt 更换成加速后的 best.engine 后,执行推理时标注的类别名不正确的问题3.3 导…

面向教育机构的IT管理

多年来,高等教育见证了一些惊人的技术创新,包括远程学习、VR 和 AR 实验室、物联网等。随着技术席卷高等教育领域,机构有望高度依赖其技术基础设施,将学生的想法变为现实,以支持学习渠道并促进研究和合作。 另一方面&…

JMeter发送表单数据,响应体报错:参数校验异常

请求方式是post,请求参数就是表单形式。这个时候我们可以把请求参数写到参数里,也可以选择写到消息体数据里。 1、如果是写到参数中,那Content-Type默认就是表单格式,不需要格外添加HTTP信息头管理器。 2、如果是写到消息体数据中…

语音消息实现(聊天向)

语音消息实现记录下: SpringBootVue3客服项目,网页录制发送语音消息 Vue中使用js-audio-recorder插件实现录音功能并实现上传Blob数据到SpringBoot后台接口 2fps/recorder github地址 Recorder的API 语音测试地址 [Web] 4分钟搭建一个简洁好看的 We…

如何购买北京法拍房

1、对于有限购的法拍房来说,在没有购房者资格的前提下,请不要跟拍,就算是房子拍下来了,没办法过户的话,房子还不能算是你的,弃权则被罚保证金。2、对于没有限购的法拍房来说,在没有购房资格的前…

动态规划dp —— 24.最长湍流子数组

解释:数组中子数组中相邻数值一升一降称为湍流子数组 示例1: 1.状态表示 是什么?dp表中里的值所表示的含义就是状态表示 因为i位置是有两种情况:1.上升趋势 2.下降趋势 所以需要定义两种状态表示来把两种情况分开 f[i]表示&am…

抖音自动生成视频、字幕、自动上传发布

dy-auto ✨ 抖音自动生成视频、字幕、自动上传发布✨ 项目地址 点击进入https://github.com/Richard0403/dy-auto 录屏效果 https://github.com/Richard0403/dy-auto/assets/14147304/21400a42-9296-4956-9517-ced8d8bf4737 技术架构 名称功能ffmpeg处理视频的生成&…

Vue中如何进行Markdown文档展示与解析?

Vue中如何进行Markdown文档展示与解析? Markdown是一种轻量级的标记语言,可以在文本中使用简单的标记来表示格式和排版。在Vue项目中,Markdown文档的使用越来越普遍,因此在Vue中如何进行Markdown文档展示与解析也成为了一个热门话…

数据湖仓一体化架构:探究新一代数据处理的可能性

一、引言 随着大数据的快速发展,企业不断寻求高效、灵活和经济的方法来处理和管理海量数据。在这种背景下,数据湖和数据仓库这两种不同的架构模式各自展现出其独特的优势。而数据湖仓一体化架构,是对这两种模式优势的综合,为企业…

9. WebGPU 平移变换

我们将开始编写与顶点缓冲区文章中的示例类似的代码,但这次将绘制单个 F 而不是一堆圆,并使用索引缓冲区来保持数据更小。 让我们在像素空间而不是裁剪空间中工作,就像 Canvas 2D API 我们将制作一个 F,将从 6 个三角形构建它 …

高级 IO(select poll epoll)

目录 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 ​异步IO 小结 同步通信 vs 异步通信(synchronous communication/ asynchronous communication) 同步和异步关注的是消息通信机制 阻塞 vs 非阻塞 其他高级IO 非阻塞IO fcntl 实现函数SetNoBlock I/O…

Windows Server AD域控服务器升级/迁移(AD域控的五大角色转移)

Windows Server AD域控服务器升级/迁移(AD域控的五大角色转移) 新域控服务器安装配置域控服务器,加入现有域域控角色迁移到新域控服务器原域控服务器降级退域 本文主要介绍在现有域环境下如何进行域控服务器的迁移/升级操作。对于域结构的网络…

python自动化测试框架:unittest测试用例编写及执行

本文将介绍 unittest 自动化测试用例编写及执行的相关内容,包括测试用例编写、测试用例执行、测试报告等内容。 官方文档: https://docs.python.org/zh-cn/3/library/unittest.mock.html 1. 测试用例编写 在 unittest 中,一个测试用例通常…

【二等奖方案】系统访问风险识别「QDU」团队解题思路

第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束。大赛官方竞赛平台DataFountain(简称DF平台,官号统称DataFountain 或DataFountain数据科学)正在陆续释出各赛题获奖队伍的方案思路。 本方案为【系统访问风险识别】赛题…

精选个人创业计划

精选个人创业计划精选篇1 一、企业概况 以突出“新鲜”“精致”为主要特色。坐落于河北区昆纬路的一个小店,主营鲜花与礼品的零售。它没有亮丽的装潢设计,而是着重朴实的风格,突出了产品的“精”与“美”,成为人们五彩斑斓生活中不…

五年磨一剑——Sealos 云操作系统正式发布!

这是个宏伟的计划 这是一个宏伟的计划,漫长且有趣。 2018 年的某个夜晚,夜深人静,我挥舞键盘,敲下了 Sealos 的第一行代码。当时仓库命名为 “kubeinit”,后来觉得格局太小,我不可能只做一个安装 Kuberne…

2023.6.8-TS-yum update集群后奔溃故障(已解决)

2023.6.8-TS-yum update集群后奔溃故障(已解决) 1、故障背景 自己在安装falco软件时,使用yum update升级了系统后,就出现这个情况了。。。 2、报错现象 kubeclt无法查看pod kubectl get poE0608 09:38:49.094714 2268 memcache.go:265] couldnt ge…

【沐风老师】3dMax一键多边形门(PolyDoor)、窗(PolyWindow)插件使用方法详解

3dMax一键多边形门、窗插件使用教程 3dMax一键多边形门(PolyDoor)、窗(PolyWindow)插件,将选择的多边形面一键转化为门、窗模型。你可以通过编辑多边形的线框(边)来定义门、窗的样式&#xff0…

【备战秋招】每日一题:4月23日美团春招:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200道互联网大厂模拟练习题&a…