reactjs - 如何在没有中间件的情况下在 Redux 中进行异步调用?
问题描述
我有一个简单的 redux 项目,它使用 fetch api 在函数中对外部 api 进行异步调用,并通过使用 redux-thunk 中间件返回函数来映射用户 ID。如何在不使用任何中间件的情况下重构代码?有可能以简单的方式吗?我尝试阅读这篇文章,但迷路了。
我的 redux 代码 -
const redux = require("redux");
const createStore = redux.createStore;
const applyMiddleware = redux.applyMiddleware;
const thunkMiddleware = require("redux-thunk").default;
const fetch = require("node-fetch");
const initialState = {
loading: false,
users: [],
error: "",
};
const FETCH_USERS_REQUEST = "FETCH_USERS_REQUEST";
const FETCH_USERS_SUCCESS = "FETCH_USERS_SUCCESS";
const FETCH_USERS_FALIURE = "FETCH_USERS_FALIURE";
const fetchUsersRrequest = () => {
return {
type: FETCH_USERS_REQUEST,
};
};
const fetchUsersSuccess = (users) => {
return {
type: FETCH_USERS_SUCCESS,
payload: users,
};
};
const fetchUsersFaliure = (error) => {
return {
type: FETCH_USERS_FALIURE,
payload: error,
};
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case FETCH_USERS_REQUEST:
return {
...state,
loading: true,
};
case FETCH_USERS_SUCCESS:
return {
//...state,
loading: false,
users: action.payload,
error: "",
};
case FETCH_USERS_FALIURE:
return {
//...state,
loading: false,
users: [],
error: action.payload,
};
}
};
const fetchUsers = () => {
return function (dispatch) {
dispatch(fetchUsersRrequest());
fetch("https://jsonplaceholder.typicode.com/users")
.then((res) => res.json())
.then((res) => {
const users = res.map((user) => user.id);
console.log(users);
dispatch(fetchUsersSuccess(users));
})
.catch((error) => {
dispatch(fetchUsersFaliure(error.message));
});
};
};
const store = createStore(reducer, applyMiddleware(thunkMiddleware));
store.subscribe(() => {
console.log(store.getState());
});
store.dispatch(fetchUsers());
解决方案
好吧,Redux 中间件是异步逻辑的地方,所以你基本上是在问“我如何在没有汽油的情况下驾驶我的汽车?” 你可能会得到一些解决方法的答案,但它们都会归结为“把它推上山,让它滚下来”。它可能会起作用,但它确实绕过了问题而不是帮助;)
所以我真正能做的就是推荐你阅读包含一整章的官方教程:https ://redux.js.org/tutorials/essentials/part-5-async-logic
一般来说,我建议你从一开始就从官方教程开始,因为到目前为止你编写的代码是一种非常过时的 redux 风格,我们不建议你编写这样的新应用程序 - 它是更多的代码要写,更难学习那种旧的风格。
推荐阅读
- anylogic - AB模型中如何使用vehicle inState命令
- backbone.js - 2014 年创建的主干代码停止工作,我不知道如何更新它
- python - 我想像这样设置我的变量值
- loops - 在剧本中为同一主机上的多个用户设置多个授权密钥
- unix - UNIX 中 IF 语句中的 Fork()
- python-3.x - 使用无头 Chrome 驱动程序截屏无法正常工作
- java - 显示从 InputStream/InputReader 流式传输的数据,同时保留空格
- javascript - 如何将 json 对象从 PHP 转换为 Javascript 数组
- linux - 带有 TileGX 工具链和 LTO 的 LLVM 3.3 无法正常工作
- pandas - 用特定值替换最后一个有效索引