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

async thunk 解决 API 调用的依赖问题

async thunk 解决 API 调用的依赖问题

一句话节省看下面一堆内容的时间就是:

async thunk 中可以使用 async/await 锁住其他的 action 操作

一般 API 之间存在三种情况:

  1. A 和 B 之间没有依赖关系

    这样的情况下,A 和 B 可以各调用各的,哪块数据拉完就先渲染哪块

  2. B 依附于 A 进行调用

    比如说有些数据只有用户登录后才能获取

  3. A 和 B 必须同时完成调用

    这个就没什么好多说的

第一点和第二点就算是原生的 Redux,处理起来虽然稍微有些的麻烦,不过实现起来相对而言也比较简单。第三点使用原生的 Redux 处理起来就比较麻烦,以前实现的方式大致如下:

// in action file
// ...
function fetchSomeData() {// call api to store datareturn dispatch => {batch(() => {dispatch(fetchData1());dispatch(fetchData2());dispatch(fetchData3());// ..some more dispatches...});}
}
...// in react component
dataLoaded(){// ....retrieve all the data from different places...if (!data1)    return false;if (!data2)    return false;// ...check all the data...return true;
}// ...
render() {if (this.dataLoaded()) {return actual_content;} else {return loading_content;}
}
// ...

之前想,如果可以这样调用的话就方便了:

function fetchSomeData() {// call api to store datareturn dispatch => {Promise.all([dispatch(fetchData1());dispatch(fetchData2());dispatch(fetchData3());// ...some more dispatches...]).then(() => dispatch(setLoading(false)));}
}

可惜当时的 batch 还不支持这个操作,因此大多数情况下借用第三方的工具,如 Redux Saga 之类的实现这种功能会比较方便。不过从 Redux Toolkit 之后,就可以比较方便的使用 Promise.all 进行实现了。

大致的实现方法如下:

  • userSlice

    import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
    import axios from 'axios';export const userSlice = createSlice({name: 'user',initialState: {data: [],isLoading: false,error: null,},extraReducers(builder) {builder.addCase(fetchUsers.pending, (state, action) => {state.isLoading = true;});builder.addCase(fetchUsers.fulfilled, (state, action) => {state.isLoading = false;state.data = action.payload;});builder.addCase(fetchUsers.rejected, (state, action) => {state.isLoading = false;state.error = action.error;});},
    });export const fetchUsers = createAsyncThunk('users/fetch', async () => {const response = await axios.get('https://jsonplaceholder.typicode.com/users');console.log(new Date());return response.data;
    });export const usersReducer = userSlice.reducer;
    
  • postSlice

    // similar configuration as user
    function later(delay) {return new Promise(function (resolve) {setTimeout(resolve, delay);});
    }export const fetchPosts = createAsyncThunk('posts/fetch', async () => {await later(5000);const response = await axios.get('https://jsonplaceholder.typicode.com/posts');console.log(new Date());return response.data;
    });
    
  • 另一个调用这两个 slice 的 thunk

    // similar configuration as previous
    export const fetchHome = createAsyncThunk('home/fetch',async (_, thunkAPI) => {const res = await Promise.all([thunkAPI.dispatch(fetchUsers()),thunkAPI.dispatch(fetchPosts()),]);console.log(res);return [];}
    );
    

在组建中就可以直接调用 fetchHome,实现结果如下:

在这里插入图片描述

相关文章:

async thunk 解决 API 调用的依赖问题

async thunk 解决 API 调用的依赖问题 一句话节省看下面一堆内容的时间就是: async thunk 中可以使用 async/await 锁住其他的 action 操作 一般 API 之间存在三种情况: A 和 B 之间没有依赖关系 这样的情况下,A 和 B 可以各调用各的&#x…...

java 黑马头条 day3 实名认证分布式事务问题 seata

1 完善实名认证功能 1.1 实名认证分布式事务问题 1.1.1 问题分析 在昨天的实名认证代码中,审核完毕后添加 id5的演示异常,重新使用postman进行测试, 会发现 出现异常后 本地方法因为有 Transactional注解 对ap_user ap_user_realname的操作会回滚 而…...

测试开发之Django实战示例 第七章 创建电商网站

第七章 创建电商网站在上一章里,创建了用户关注系统和行为流应用,还学习了使用Django的信号功能与使用Redis数据库存储图片浏览次数和排名。这一章将学习如何创建一个基础的电商网站。本章将学习创建商品品类目录,通过session实现购物车功能。…...

【C++之容器篇】造轮子:list的模拟实现与使用

目录前言一、关于list1. 简介2. 成员类型二、默认成员函数1. 构造函数1. list()2. list(size_t n,const T& val T())和list(InputIterator first,InputIterator last)2. 拷贝构造函数3. 析构函数4. 赋值运算符重载函数三、迭代器1. 普通对象的正向迭代器2. const对象的正向…...

自动驾驶:决策规划算法岗位面经分享

本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页: 主要分享计算机算法类在面试互联网公司时候一些真实的经验 人情况是985本硕,硕士研究方向是强化学习在移动机器人路径规划中的应用,一段自动驾驶中小厂实习经历,秋招找的大都是机器人和自动驾…...

2.7、进程调度的时机、切换与过程、方式

1、进程调度的时机 进程调度\color{red}进程调度进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机 进程在操作系统内核程序临界区\color{red}操作系统内核程序临界区操作系统内核程序临界区中不能\color{red}不能…...

工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...

ESP32S3系列--SPI从机驱动详解(一)

一、目的 在之前的博文中《ESP32S3系列--SPI主机驱动详解(一)》、《ESP32S3系列--SPI主机驱动详解(二)》我们详细讲解了ESP32S3上的SPI外设如何工作在主机模式并通过代码的形式帮助大家理解。 本篇我们将介绍SPI外设工作在从机模式下的使用知识点。 二、介绍 参考资料 http…...

【实战篇】移动端H5网页在ios滑动不流畅和禁止缩放问题

问题描述:移动端H5网页在ios滑动不流畅和禁止缩放问题 最近开发小程序,有一个富文本展示页面使用的是<webview>H5网页嵌入的,当你用 overflow-y:scroll 属性的时候,内容超出容器溢出滚动的效果很迟顿,特别是在IOS系统中,而且页面还会缩放。 解决方案: 1…...

12 循环神经网络(基础篇) Basic RNN

文章目录问题引入关于权重权重共享RNN CellRNN原理RNN计算过程代码实现RNN Cell维度说明代码RNN维度说明NumLayers说明计算过程代码参考实例问题分析多分类问题代码RNN CellRNN改进Embedding网络结构Embedding说明Linear说明代码课程来源&#xff1a; 链接课程文本参考&#xf…...

【C语言必经之路——第11节】初阶指针(2)

五、指针的运算1、指针与整数相加减看一下下面的代码&#xff1a;#include<stdio.h> int my_strlen(char* str) {int count0;while(*str!\0){count;str;//指针加减整数}return count; } int main() {int lenmy_strlen("abcdef");printf("%d\n",len);…...

SpringBoot学习(1)第一个SpringBoot程序

之前的SpringMVc就不在记录了&#xff0c;好像时间不太够了&#xff0c;但是springmvc作为javaweb的升级学一学对于springboot还是有较大的帮助的。 首先我们需要引入依赖&#xff0c;但是请注意&#xff0c;其中的一个不算是依赖&#xff0c;写法有所不同 首先需要引入 <…...

什么是热迁移?90%的企业都理解错误

科技的发展&#xff0c;新冠的冲击&#xff0c;让市场竞争愈发激烈。尽管云计算服务为企业免除了基础硬件的建设和维护成本&#xff0c;当企业需要进行业务跨架调整、升级维护、环境测试等场景而进行云迁移&#xff0c;其过程中所带来的停机时间&#xff0c;就变得尤为头疼了。…...

Scratch少儿编程案例-丝滑版贪吃蛇

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

Linux系统之网卡子接口配置方法

Linux系统之网卡子接口配置方法一、本地系统环境检查1.检查系统版本2.检查系统内核版本3.检查本地IP地址二、网卡子接口介绍1.网卡子接口简介2.网卡子接口的优点3.网卡子接口的缺点三 加载802.1q 模块1.查看系统802.1q 模块信息2.加载802.1q 模块3.检查802.1q 模块加载状态四、…...

2023上半年软考中级系统集成项目管理工程师2月25日开班

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…...

YOLO-V5轻松上手

之前介绍了YOLO-V1~V4版本各做了哪些事以及相较于之前版本的改进。有的人或许会想“直接学习最近版本的算法不好吗”&#xff0c;在我看来&#xff0c;每一个年代的版本/算法都凝聚着当年学术界的智慧&#xff0c;即便是它被淘汰了也依旧有值得思考的地方&#xff0c;或是可以使…...

CSS的优先级理解

权重 的 4个等级定义我们把特殊性分为4个等级&#xff0c;每一个等级代表一类选择器&#xff0c;每个等级的值相加得出选择器的权重。4个等级的定义如下&#xff1a;第一等级&#xff1a;代表内联样式&#xff0c;如style""&#xff0c;权值为 1000第二等级&#xff…...

前端工程师leetcode算法面试必备-二分搜索算法(中)

一、前言 二分搜索算法本身并不是特别复杂&#xff0c;核心点主要集中在&#xff1a; 有序数组&#xff1a;指的是一个递增或者递减的区间&#xff08;特殊情况如&#xff1a;【852. 山脉数组的峰顶索引】&#xff09;&#xff1b; 中间数&#xff1a;用来确定搜索目标落在左…...

【数据库】MySQL 单表查询,多表查询

目录 单表查询 一&#xff0c;创建表worker 1&#xff0c;创建表worker的sql代码如下&#xff1a; 2&#xff0c;向worker表中插入信息 二&#xff0c; 按要求进行单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 …...

【c++】vector实现(源码剖析+手画图解)

vector是我接触的第一个容器&#xff0c;好好对待&#xff0c;好好珍惜&#xff01; 目录 文章目录 前言 二、vector如何实现 二、vector的迭代器&#xff08;原生指针&#xff09; 三、vector的数据结构 图解&#xff1a; 四、vector的构造及内存管理 1.push_back() …...

VScode查看python f.write()的文件乱码

VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码&#xff0c; print&#xff08;&#xff09;&#xff0c;汉字正常显示&#xff0c; 使用 with open&#xff08;&#xff09;as f&#xff1a; f.write&#xff08;&#xff09;文件后&#xff0c; 在 …...

excel应用技巧:如何用函数制作简易抽奖动图

利用INDEX函数和随机整数函数RANDBETWEEN配合&#xff0c;在Excel中做一个简单的抽奖器&#xff0c;可以随机抽取姓名或者奖品。有兴趣的伙伴可以做出来试试&#xff0c;撞撞2023年好运气。每次年会大家最期待的就是抽奖环节。为了看看自己今年运气怎么样&#xff0c;会不会获奖…...

CSI Tool 安装及配置记录

一、Ubuntu安装 1.下载Ubuntu 首先安装Ubuntu 14.04 LTS 64位下载地址&#xff08;页面中第一个链接&#xff09; 2.制作启动盘&#xff08;注意备份&#xff09; 可以使用官方的工具Rufus&#xff0c;下载地址&#xff1a;https://rufus.ie/ 打开Rufus&#xff0c;先备份…...

华为OD机试 - 最低位排序(Python)| 真题+思路+代码

最低位排序 题目 给定一个非空数组(列表),起元素数据类型为整型, 请按照数组元素十进制最低位从小到大进行排序, 十进制最低位相同的元素,相对位置保持不变, 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位。 输入 给定一个非空数组(列表) 其…...

C#开发的OpenRA使用TrimExcess方法

C#开发的OpenRA使用TrimExcess方法 当你在细看OpenRA的代码,就会发现在下面这段代码添加了一个方法: foreach (var nodes in levels) nodes.TrimExcess(); 在上面代码里遍历整个节点列表,把所有节点都调用TrimExcess方法处理一下, 这样做的意义何在?为什么我们在一般的代码…...

ImageMagick任意文件读取漏洞(CVE-2022-44268)

0x00 前提 前几天爆出一个 ImageMagick 漏洞 &#xff0c;可以造成一个任意文件读取的危害比较可观&#xff0c;最近有时间来复现学习一下 主要是影响的范围很大&#xff0c;很多地方都有这个问题&#xff0c;需要来学习一下 0x01 介绍 ImageMagick 是一个免费的开源软件套…...

第十九篇 ResNet——论文翻译

文章目录 摘要1 引言2 相关工作3 深度残差学习3.1 残差学习3.2 快捷恒等映射3.3 网络架构3.4 实现4 实验4.1 ImageNet 分类4.2 CIFAR-10 和分析4.3 PASCAL 和 MS COCO 上的物体检测🐇🐇🐇🐇🐇🐇 🐇 欢迎阅读 【AI浩】 的博客🐇 👍 阅读完毕,可以动动小手赞一…...

RiProRiProV2主题美化顶部增加一行导航header导航通知

背景: 有些网站的背景顶部有一行罪行公告,样式不错,希望自己的网站也借鉴过来,本教程将指导如何操作,并调整成自己想要的样式。 比如网友搭的666资源站 xd素材中文网...

RT-Thread MSH_CMD_EXPORT分析

RT-Thread MSH_CMD_EXPORT分析 1. 源码分析 在rt-thread中&#xff0c;使用FinSH&#xff0c;可以支持命令行。在源码中&#xff0c;使用MSH_CMD_EXPORT导出函数到对应命令。 extern void rt_show_version(void); long version(void) {rt_show_version();return 0; } MSH_CM…...

企业网站免费模板/网站开发北京公司

2019独角兽企业重金招聘Python工程师标准>>> JavaScript的self和this使用小结 var self this? Getting Out of Binding Situations in JavaScript Window 对象 js对象中使用_selfthis的原因&#xff1f; 转载于:https://my.oschina.net/letiantian/blog/282715...

中国建筑工程网施工组织设计/哈尔滨seo服务

一、前言 在配置springboot的配置的时候突然看到时间是Duration来配置的&#xff0c;上源码看到这样一个方法 /*** Obtains a {code Duration} from a text string such as {code PnDTnHnMn.nS}.* <p>* This will parse a textual representation of a duration, includ…...

泉州市服务好的网站设计/免费个人推广引流平台

1、NPN、PNP三极管用作开关的基本电路 2、负载位置 为什么不管是NPN还是PNP&#xff0c;电路对应的负载要放到集电极C&#xff0c;而没有放到发射极E呢&#xff1f; 因为三极管的输入回路是从基级B控制发射极E&#xff0c;负载如果放到发射极E&#xff0c;那就会对输入回路造…...

做海报的话网站/关键词优化的技巧

首批中国人工智能产业发展联盟特约媒体以及联盟媒体专家委员会委员公布。 中国人工智能产业发展联盟媒体项目组成立会于2018年1月25日在京举行。会议由联盟办公室主任石霖主持。 我国人工智能领域进入了蓬勃发展阶段&#xff0c;各行各业形成了以人工智能为基础的科技创新体系…...

济宁医院网站建设/站长工具seo优化建议

NewPan 贝聊科技 iOS 菜鸟工程师这款为天猫定制的 iPhone&#xff0c;你买了吗&#xff1f;由于没摸过真机&#xff0c;所以严格意义上来说&#xff0c;这篇文章应该有一个更加接地气的名字&#xff1a;“模拟器适配实战”。01.适配原则 由于这篇文章是实战&#xff0c;就不巴拉…...

邢台做网站哪个网络公司好/百度在线使用

sys.ps1、sys.ps2:字符串&#xff0c;指定解释器的首要和次要提示符。仅当解释器处于交互模式时&#xff0c;它们才有定义。这种情况下&#xff0c;它们的初值为 >>> 和 ... 。如果赋给其中某个变量的是非字符串对象&#xff0c;则每次解释器准备读取新的交互式命令时…...