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

Redux Saga中Fetch返回空对象问题:新手求助

问题:Redux Saga中USERS_FETCH_SUCCEEDED的payload为空对象,但控制台能打印出数据?

先看看你贴的代码:

import axios from "axios"; 
import {call, put, takeLatest} from "redux-saga/effects"; 
import { USERS_FETCH_REQUESTED, USERS_FETCH_SUCCEEDED, USERS_FETCH_FAILED } from 'actions/constants'

function *fetchUsers(action) { 
  try { 
    const response = yield call(fetch, 'https://jsonplaceholder.typicode.com/users'); 
    const data = response.json(); 
    console.log(data) 
    yield put({type: USERS_FETCH_SUCCEEDED, payload: data}); 
  } catch (e) { 
    yield put({type: USERS_FETCH_FAILED, payload: e.message}); 
  } 
}

function* mySaga() { 
  yield takeLatest(USERS_FETCH_REQUESTED, fetchUsers); 
} 

export default mySaga 

这个问题我之前也踩过坑!核心原因是你忽略了response.json()是异步操作——它返回的是一个Promise,而你没有用yield来等待它完成解析。

你看到控制台打印出10条数据,是因为浏览器的控制台会特殊处理Promise对象:当Promise最终resolve后,控制台会自动展开它的结果给你看,但实际上在你执行yield put的时候,data还只是一个未解析的Promise对象,并不是真正的用户数组,所以Redux store里收到的payload自然是空对象(或者说Promise对象被序列化后的结果)。

修正方法很简单,给response.json()加上yield即可:

修正后的代码

import axios from "axios"; 
import {call, put, takeLatest} from "redux-saga/effects"; 
import { USERS_FETCH_REQUESTED, USERS_FETCH_SUCCEEDED, USERS_FETCH_FAILED } from 'actions/constants'

function *fetchUsers(action) { 
  try { 
    const response = yield call(fetch, 'https://jsonplaceholder.typicode.com/users'); 
    // 加上yield,等待Promise解析完成
    const data = yield response.json(); 
    console.log(data) 
    yield put({type: USERS_FETCH_SUCCEEDED, payload: data}); 
  } catch (e) { 
    yield put({type: USERS_FETCH_FAILED, payload: e.message}); 
  } 
}

function* mySaga() { 
  yield takeLatest(USERS_FETCH_REQUESTED, fetchUsers); 
} 

export default mySaga 

这样Saga会等待response.json()的Promise resolve,拿到真正的用户数据后再发送成功动作,payload就会是你期望的10条用户数据了。另外提一句,你导入了axios但没用到,这个可以根据需求删掉或者替换掉fetch来使用axios,也是完全没问题的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:37