【问题标题】:How to Make Asynchronous Calls in Redux Without Middlewares?如何在没有中间件的情况下在 Redux 中进行异步调用?
【发布时间】:2021-07-14 01:26:01
【问题描述】:

我有一个简单的 redux 项目,它使用 fetch api 在函数中对外部 api 进行异步调用,并通过使用 redux-thunk 中间件返回一个函数来映射用户 ID。如何在不使用任何中间件的情况下重构代码?有可能以简单的方式吗?我尝试阅读this article,但迷路了。

我的 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());

【问题讨论】:

    标签: reactjs redux async-await react-redux redux-thunk


    【解决方案1】:

    嗯,在 Redux 中间件中异步逻辑的地方,所以你基本上是在问“我如何在没有汽油的情况下驾驶我的汽车?”你可能会得到一些解决方法的答案,但它们都会归结为“把它推上山,让它滚下来”。它可能有效,但它确实绕过了问题,而不是帮助;)

    所以我真正能做的就是建议您阅读包含完整章节的官方教程:https://redux.js.org/tutorials/essentials/part-5-async-logic

    一般来说,我建议你从官方教程 from the beginning 开始,因为到目前为止你编写的代码是一种非常过时的 redux 风格,我们不建议你编写新的应用程序,例如那 - 编写更多的代码并且更难学习旧样式。

    【讨论】:

    • 你说得对,我刚开始使用 redux 并从 yt 教程中做到了这一点。现在我实习地点的上司问我是否可以在没有中间件的情况下做到这一点,我已经摸不着头脑了 7-8 小时
    • 向你的上级问好——我是一名 redux 维护者,如果没有中间件,我真的不建议这样做。也许这有助于将其置于他们的上下文中。如果他们没有中间件,我通常会建议他们在没有 redux 的情况下完全解决整个问题
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多