reactjs - 使用 Saga 获取 API 没有给出任何响应
问题描述
全部..
我是 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,
};
};
减速器 从“../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,
loading: false,
};
case type.GET_USERS_FAILED:
return {
...state,
loading: false,
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}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
})
.then((response) => {
return response.json();
})
.catch((error) => {
throw error;
});
return result;
}
推荐阅读
- android - 在改造响应中调用方法
- typescript - PouchDb 动态标头
- php - 数据未发布。请检查我的代码
- google-apps-script - 将特定工作表的内容复制到主工作表
- regex - 正则表达式查找字符串是否包含两个匹配的子字符串
- c# - 在客户端机器上运行水晶报表时出现异常
- python-3.x - 将列表python数字列表拆分为多个列表
- django - 在处理 django 视图时检测 504 的发生
- angular - 如何在 Angular 7 中模拟 MatSidenav 类型的输入
- javascript - JQuery:我的表单正在提交,即使验证返回 false