redux是怎样做异步请求的?

文章对比了redux-thunk和redux-saga这两大主流Redux异步中间件的优缺点。redux-thunk简洁轻量,但存在样板代码多和耦合性高的问题,而redux-saga提供更强大的功能和解耦方案,但学习成本高且体积较大。
摘要由CSDN通过智能技术生成

前言

一般的异步请求,可以在componentDidmount中直接进行请求,无需借助redux。
但是在一定规模的项目中,上述方法很难进行异步流的管理,通常情况下我们会借助redux的异步中间件进行处理。
异步流的中间件有很多,当下主流的异步中间件有两种,redux-thunk、redux-saga

一、redux-thunk中间件?

redux-thunk的优点?

  1. 体积小:redux-thunk的实现方法很简单,只有不到20行代码。
  2. 使用简单:redux-thunk没有引入像redux-saga或者redux-observable额外的范式,上手比较简单。

redux-thunk的缺点?

  1. 样板代码过多:与redux本身一样,通常一个请求需要大量的代码,而且很多请求都是重复性质的。
  2. 耦合性严重:异步操作与redux的action耦合在一起,不方便进行管理。
  3. 功能孱弱:有一些实际开发中常用的功能需要自己进行封装

redux-saga中间件?

redux-saga优点?

异步解耦:saga异步操作被转移到saga.js中,不再是参杂在axtion.js或者是component.js
中。
action的摆脱thunk function,dispath的参数依然是一个纯粹的action,而不是充满黑魔法的thunk function。
功能强大:redux-saga提供了大量的saga辅助函数和 Effect创建器供开发者使用,开发者无需封装或者简单封装即可使用。
灵活性:redux-saga可以串行/并行组合起来,形成一个非常使用的异步flow。
易测试:提供了各种case的测试方案,包括mock task,分支覆盖等等。

redux-saga缺陷?

额外的学习成本:redux-saga不仅在使用难以理解的gennertor function,而且有数十个API,学习成本远超过redux-thunk。最重要的是额外的学习成本是只服务于这个库的,与redux-observable不同,redux-observable,虽然有额外的学习成本,但是背后是rxjs和一整套思想。
体积庞大:体积略大,代码近2000行,min版25KB左右
功能过剩:实际上并发控制等功能很难用到,但是我妈依然需要引入这些代码。
ts支持不友好:yield无法返回Ts类型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux Toolkit 包含一个名为 `createAsyncThunk` 的工具函数,它可以帮助我们轻松地处理异步请求。 使用 `createAsyncThunk` 函数,我们可以定义一个函数来处理异步请求,并且该函数会自动生成与请求相关的三个 action:pending(请求开始),fulfilled(请求成功)和 rejected(请求失败)。 下面是一个使用 `createAsyncThunk` 的示例: ```javascript import { createAsyncThunk } from '@reduxjs/toolkit'; import { fetchUser } from './api'; export const getUser = createAsyncThunk( 'user/fetch', async (userId, thunkAPI) => { const response = await fetchUser(userId); return response.data; } ); // 然后在 reducer 中处理请求状态 const userSlice = createSlice({ name: 'user', initialState: { user: null, isLoading: false, error: null, }, reducers: {}, extraReducers: { [getUser.pending]: (state, action) => { state.isLoading = true; }, [getUser.fulfilled]: (state, action) => { state.isLoading = false; state.user = action.payload; }, [getUser.rejected]: (state, action) => { state.isLoading = false; state.error = action.error.message; }, }, }); ``` 在上面的示例中,我们首先使用 `createAsyncThunk` 函数创建了一个名为 `getUser` 的异步 action,它的名称为 `user/fetch`。然后我们在 `extraReducers` 中处理了请求状态。当请求开始时,`getUser.pending` action 会被触发,我们可以在这里将 `isLoading` 设置为 `true`。当请求成功时,`getUser.fulfilled` action 会被触发,我们可以在这里将 `isLoading` 设置为 `false` 并将返回的数据保存在 `user` 属性中。当请求失败时,`getUser.rejected` action 会被触发,我们可以在这里将 `isLoading` 设置为 `false` 并将错误信息保存在 `error` 属性中。 注意,我们在异步函数中的第二个参数 `thunkAPI` 中可以访问 `dispatch`、`getState`、`extra` 和 `fulfillWithValue` 等方法,这些方法可以帮助我们更好地处理异步请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值