You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promise resolve后返回值无法在.then中赋值并存入Redux store怎么解决

错误原因

  • Redux Reducer必须是无副作用的纯函数,禁止在Reducer内部执行异步请求、接口调用等操作,Reducer仅能根据传入的state和action同步计算返回新的state。
  • 你代码中apiTest()返回的是Promise实例,.then回调属于异步微任务,会在同步代码执行完后才触发。你在getData中直接return的时候,.then还未执行,data变量没有被赋值,最终存到listData里的只是Promise对象,不是接口返回的真实数据。
  • API接口代码中导入的React、useEffect、useState完全没有被使用,属于冗余导入,可以直接删除。

修复方案

你需要使用Redux异步中间件(推荐用最简单的redux-thunk)来处理异步请求逻辑,所有接口调用放在action中执行,请求拿到结果后再发action通知Reducer更新状态。

1. 先修正API接口代码

// 移除无用的React相关导入
const apiCall = async () => {
  try {
    const payload = await fetch("https://jsonplaceholder.typicode.com/users");
    const results = await payload.json();
    return results;
  } catch (err) {
    console.log(`error found of type ${err}`);
  }
};

export default apiCall;

2. 配置redux-thunk中间件

在你创建Redux store的位置,引入redux-thunk并注册为中间件,示例:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import contactListReducer from './reducers/contactListReducer';

const store = createStore(contactListReducer, applyMiddleware(thunk));

3. 编写异步Action

新建action文件,编写异步请求逻辑:

import apiCall from "../api/ApiTest";

export const fetchContactList = () => {
  return async (dispatch) => {
    const result = await apiCall();
    // 请求成功后派发action,把数据传给Reducer
    dispatch({
      type: "FETCH_SUCCESS",
      payload: result
    });
  }
}

4. 修正Reducer代码

移除Reducer内的异步逻辑,仅做状态更新:

const initialState = {
  listData: null
};

const contactListReducer = (state = initialState, action) => {
  switch (action.type) {
    case "FETCH_SUCCESS":
      return Object.assign({}, state, {
        listData: action.payload
      });
    default:
      return state;
  }
};

export default contactListReducer;

5. 组件中触发请求

在需要拉取数据的组件中,dispatch上面写的异步action即可:

import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchContactList } from '../actions/contactActions';

function ContactList() {
  const dispatch = useDispatch();
  const listData = useSelector(state => state.listData);

  useEffect(() => {
    // 组件挂载时触发请求
    dispatch(fetchContactList());
  }, [dispatch]);

  // 后续可以直接使用listData渲染
  return <div>{/* 渲染逻辑 */}</div>
}

内容的提问来源于stack exchange,提问作者NinelSeyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:30:03