我已经能够创建一个无限循环,不断从 API 获取数据。
我使用 useEffect 条件调度来运行,它应该只运行一次。
但是当我查看 Redux DevTools 时,从 api 中检索数据是在一个无限循环中。
片:
import { createSlice } from "@reduxjs/toolkit";
const initialState = { cats: [] };
const catSlice = createSlice({
name: "cat",
initialState,
reducers: {
setCat: (state, action) => {
state.cats = action.payload;
},
},
});
export const { setCat } = catSlice.actions;
export default catSlice.reducer;
佐贺:
import { call, put, takeLatest } from "redux-saga/effects";
import { setCat } from "./catSlice";
function* getCatsFetch() {
const cats = yield call(() => fetch(`https://xxxapi.com`));
const formatedCats = yield cats.json();
yield put(setCat(formatedCats));
}
function* catSaga() {
yield takeLatest("cat/setCats", getCatsFetch);
}
export default catSaga;
App.js 中的命令
useEffect(() => {
dispatch(setCats());
}, [dispatch]);
你能帮我停止对 api 的无休止的请求吗?谢谢
回答1
问题是您的 getCatsFetch
传奇会发出 setCat
动作。而您的 catSaga
正在等待任何 setCat
触发另一个 getCatsFetch
传奇。因此,即使您只从组件中调度一个 setCat
操作,saga 在成功运行后也会发出一个 setCat
。您正在循环中间件。
要更正此问题,您可能应该将 takeLatest
更改为寻找某种 getCats
操作,然后在您的组件中发出该操作。 (不是你的传奇)。