GX博客

分享个人 Full-Stack JavaScript 项目开发经验

使用redux-thunk和cross-fetch处理Redux中的异步Action

客户端与服务器交互都存在延时问题,这使得用于改变数据源的 Action 有时候会是异步的。一般的 Action 生成器会返回一个对象形式的 Action,在使用redux-thunk中间件后,它允许你返回一个包含异步请求的函数作为 Action。文中异步请求使用了cross-fetch,它可以兼容 Node.js、浏览器和 React Native 中使用 fetch API 。


安装 redux-thunk:

yarn add redux-thunk

安装 cross-fetch:

yarn add cross-fetch

在构建 Redux 的 Store 时,应用 redux-thunk 中间件:

import {applyMiddleware, combineReducers, createStore} from 'redux';
import thunkMiddleware from 'redux-thunk';
import initialState from './initialState';
import reducers from '../reducers';
const configureStore = () =>
createStore(
combineReducers(reducers),
initialState,
applyMiddleware(thunkMiddleware)
);
export default configureStore;
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

编写异步 Action 生成器,如:

import fetch from "cross-fetch";
// ......
export const my_thunk_action_create = (data) =>
// Store dispatch getState
(dispatch, getState) => {
// Action
dispatch(show_loading());
//
return fetch('your_request_url', {
method: 'post',
headers: {
//
'Content-Type': 'application/json',
// Ajax
'x-requested-with': 'XMLHttpRequest'
},
// 'Content-Type'
body: JSON.stringify(data),
//
credentials: 'same-origin'
})
.then(res => {
if (res.status >= 400) {
throw new Error("Bad response from server");
}
// JSON
// return res.json(); catch
// res.json()
const resJson = res.json();
return resJson;
})
.then(json => {
// Action
dispatch(hide_loading());
if(json.err) {
//...
} else {
//...
}
})
.catch(err => {
// then
console.error('Fetch error occurred.', err);
// UI
// dispatch(response_error());
});
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

值得注意:

  • redux-thunk 能够区分普通 Action 和 thunks Action,所以普通的 Action 生成器可以按照原来的方式返回 Action。
  • thunks Action 允许你在返回的函数中调用多个 dispatch 来分发多个 Action。
  • 使用 fetch 时有不少常规代码,所以我们可以对它进一步封装。
  • 你需要为其它浏览器添加 fetch 及相关的 polyfill。

cross-fetch 的用法上跟标准 fetch 一样,要了解更多 fetch 的使用说明,请点击这里

版权声明:

本文为博主原创文章,若需转载,须注明出处,添加原文链接。

https://www.leeguangxing.cn/blog_post_22.html