问题描述
所有..
我是 React 新手,我在我的项目中使用了 react、redux 和 redux saga。我只是使用 saga 进行简单的 api 获取。但我不知道为什么 yield put
命令看起来不起作用。
类型
export const GET_USERS_REQUESTED = "GET_USERS_REQUESTED";
export const GET_USERS_SUCCESS = "GET_USERS_SUCCESS";
export const GET_USERS_Failed = "GET_USERS_Failed";
操作
import * as type from "../types/users";
export function getUsers(users) {
return {
type: type.GET_USERS_REQUESTED,payload: users,};
};
减速器 import * as type from "../types/users";
const initialState = {
users: [],loading: false,error: null,};
export default function users(state = initialState,action) {
switch (action.type) {
case type.GET_USERS_REQUESTED:
return {
...state,loading: true,};
case type.GET_USERS_SUCCESS:
return {
...state,users: action.users,};
case type.GET_USERS_Failed:
return {
...state,error: action.message,};
default:
return state;
}
}
根减速器
import { combineReducers } from "redux";
import users from "./users";
const rootReducer = combineReducers({
users: users,});
export default rootReducer;
用户传奇
import { call,put,takeEvery } from "redux-saga/effects";
import * as type from "../redux/types/users";
function getApi() {
return fetch("https://jsonplaceholder.typicode.com/users",{
method: "GET",headers: {
"Content-Type": "application/json",},})
.then((response) => {
response.json();
})
.catch((error) => {
throw error;
});
}
function* fetchUsers(action) {
try {
const users = yield call(getApi());
yield put({ type: type.GET_USERS_SUCCESS,users: users });
} catch (e) {
yield put({ type: type.GET_USERS_Failed,message: e.message });
}
}
function* userSaga() {
yield takeEvery(type.GET_USERS_REQUESTED,fetchUsers);
}
export default userSaga;
根传奇
import { all } from "redux-saga/effects";
import userSaga from "./users";
export default function* rootSaga() {
yield all([userSaga()]);
}
创建商店
import { createStore,applyMiddleware,compose } from "redux";
import rootReducer from "./reducers/index";
import createSagaMiddleware from "redux-saga";
import rootSaga from "../sagas/index";
const sagaMiddleware = createSagaMiddleware();
const store = compose(
window.devToolsExtension && window.devToolsExtension(),applyMiddleware(sagaMiddleware)
)(createStore)(rootReducer);
sagaMiddleware.run(rootSaga);
export default store;
我不知道为什么我的用户传奇看起来不起作用。因为加载状态仍然具有真正的价值。希望任何人都可以帮助我。
提前致谢
解决方法
您正在调用您的 getApi
并将承诺返回给 call
本身。 call
会为您做到这一点。因此,只需像这样向 call
提供 getApi
:
...
function* fetchUsers(action) {
try {
const users = yield call(getApi); // <-- HERE IS THE CHANGE
yield put({ type: type.GET_USERS_SUCCESS,users: users });
} catch (e) {
yield put({ type: type.GET_USERS_FAILED,message: e.message });
}
}
...
此外,您还需要更改您的 getApi
,因为您正在使用 fetch:
async function getApi() {
const result = await fetch('https://jsonplaceholder.typicode.com/users',{
method: 'GET',headers: {
'Content-Type': 'application/json',},})
.then((response) => {
response.json();
})
.catch((error) => {
throw error;
});
return result;
}
如果您需要为 getApi
调用提供一个变量,您可以这样做:
const users = yield call(getApi,'someValue');
而你 getApi
看起来像这样:
async function getApi(someValue) {
const result = await fetch(`https://jsonplaceholder.typicode.com/users/${someValue}`,})
.then((response) => {
response.json();
})
.catch((error) => {
throw error;
});
return result;
}
,
当您使用 call
时,您不应该 call()
它。输入 yield call(getApi,"in case you have arguments")
。当你在等待承诺时,你应该这样做