javascript - API 请求在 react-app 中使用 redux-saga 失败
问题描述
我想在主页加载产品。我决定实施 usingredux-saga
来处理副作用。API 调用在 redux 传奇中失败。这是代码。你能告诉我出了什么问题吗?
api.js
export const getProducts = async (sort, order, page) => {
return await axios.post(`${process.env.REACT_APP_API}/products`, {
sort,
order,
page,
});
};
产品传奇.js
import { takeEvery, call, put, all } from "redux-saga/effects";
import ProductActionTypes from "./product.types";
import {
loadLatestArrivalProductSuccess,
loadLatestArrivalProductFail,
} from "./product.actions";
import { getProducts } from "./Api";
export function* fetchLatestArrivalProducts() {
try {
const response = yield call(getProducts("createdAt", "desc", 1));
// it's failing inside try
yield put(loadLatestArrivalProductSuccess(response.data));
} catch (error) {
yield put(loadLatestArrivalProductFail(error));
}
}
export function* fetchLatestArrivalProductsStart() {
yield takeEvery(
ProductActionTypes.LOAD_LATEST_ARRIVAL_PRODUCT_START,
fetchLatestArrivalProducts
);
}
export function* productSagas() {
yield all([call(fetchLatestArrivalProductsStart)]);
}
product.reducer.js
import ProductActionTypes from "./product.types";
const INITIAL_STATE = {
products: [],
loading: false,
page: 1,
errorMessage: undefined,
};
const productReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case ProductActionTypes.LOAD_LATEST_ARRIVAL_PRODUCT_START:
return {
...state,
loading: true,
};
case ProductActionTypes.LOAD_LATEST_ARRIVAL_PRODUCT_SUCCESS:
return {
...state,
loading: false,
products: action.payload,
};
case ProductActionTypes.LOAD_LATEST_ARRIVAL_PRODUCT_FAIL:
return {
...state,
loading: false,
errorMessage: action.payload,
};
default:
return state;
}
};
export default productReducer;
product.type.js
const ProductActionTypes = {
LOAD_LATEST_ARRIVAL_PRODUCT_START: "LOAD_LATEST_ARRIVAL_PRODUCT_START",
LOAD_LATEST_ARRIVAL_PRODUCT_SUCCESS: "LOAD_LATEST_ARRIVAL_PRODUCT_SUCCESS",
LOAD_LATEST_ARRIVAL_PRODUCT_FAIL: "LOAD_LATEST_ARRIVAL_PRODUCT_FAIL",
LATEST_ARRIVAL_PRODUCT_COUNT: "LATEST_ARRIVAL_PRODUCT_COUNT",
};
export default ProductActionTypes;
这是列出家庭所有产品的后端代码
exports.list = async (req, res) => {
try {
const { sort, order, page } = req.body;
const currentPage = page || 1;
const perPage = 3;
const products = await Product.find({})
.skip((currentPage - 1) * perPage)
.populate("category")
.populate("subs")
.sort([[sort, order]])
.limit(perPage)
.exec();
res.json(products);
} catch (err) {
console.log(err);
}
};
解决方案
在 saga 中调用getProducts
函数时,应将函数后面的参数设置为参数。
export function* fetchLatestArrivalProducts() {
try {
const response = yield call(getProducts, "createdAt", "desc", 1);
// it's failing inside try
yield put(loadLatestArrivalProductSuccess(response.data));
} catch (error) {
yield put(loadLatestArrivalProductFail(error));
}
}
更新
如果你想将 prop 传递给 saga
export function* fetchLatestArrivalProducts(action) {
try {
const response = yield call(getProducts, "createdAt", "desc", action.page);
// it's failing inside try
yield put(loadLatestArrivalProductSuccess(response.data));
} catch (error) {
yield put(loadLatestArrivalProductFail(error));
}
}
推荐阅读
- python - 如何使 Python (scipy.stats) 中的直方图看起来和 R 一样好?
- sql - 使用 hiveql 按组绑定列值
- r - 有没有一个函数可以在没有条件的情况下返回列表的索引?
- java - 如何将 JFrame 从外观和感觉上设置为未装饰?
- php - Laravel 在线状态
- javascript - Node.js 导出的行为与 ES6 模块不同
- python - Python列表副本以及用作类变量的
- javascript - Textarea Box(在 HTML 中添加文本的按钮)
- python - 如何在python中的f字符串中插入超链接
- android - 表情符号键盘 - 如何在 ReactNative 中添加类似 whatsapp 的表情符号键盘?