首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redux:多次调度一个操作会导致过多的api请求

Redux:多次调度一个操作会导致过多的api请求
EN

Stack Overflow用户
提问于 2021-07-26 13:03:07
回答 1查看 47关注 0票数 0

使用名为Jikan的动漫api,我正在尝试显示新动漫节目的宣传缩略图。我使用了两个api调用,一个用于获取新的动漫节目:

代码语言:javascript
复制
export const get_new_anime = () =>
  `${base_url}search/anime?q&order_by=score&status=airing&sort=desc`;

一个是通过获取id来获取动漫的视频(包含宣传片)。

代码语言:javascript
复制
export const get_news = (anime_id) => `${base_url}anime/${anime_id}/videos`;

在我的主页上,我映射了这些节目,为每个动漫返回一个组件:

代码语言:javascript
复制
<Promos>
{new.map((anime, index) => (
<Anime key={anime.mal_id} index={index}></Anime>))}
</Promos>

对于每个动画组件,我都有一个useEffect,它对每个新的id使用useDispatch

代码语言:javascript
复制
const Anime = ({ id, index }) => {
  const dispatch = useDispatch();
  const loadDetailHandler = () => {
    //  eslint-disable-line react-hooks/exhaustive-deps
    dispatch(loadDetail(id));

  useEffect(() => {
    loadDetailHandler(id);
  }, [id]); // eslint-disable-line react-hooks/exhaustive-deps

  const promo = useSelector((state) => state.detail.promo);

  const isLoading = useSelector((state) => state.detail.isLoading);

  return (
    <PromoBox
      style={
        !isLoading
          ? { backgroundImage: `url("${promo[index][0].image_url}")` }
          : null
            }
     ></PromoBox>);
    };

下面是我的promoReducer的样子:

代码语言:javascript
复制
const initState = {
  promo: [],
  isLoading: true,
};

const promoReducer = (state = initState, action) => {
  switch (action.type) {
    case "LOADING_PROMO":
      return {
        ...state,
        isLoading: true,
      };
    case "GET_DETAIL":
     

      return {
        ...state,

        promo: [...state.promo, action.payload.promo], 
        
        isLoading: false,
        
      };

    default:
      return { ...state };
  }
};

export default promoReducer;

这是promoAction

代码语言:javascript
复制
export const loadPromo = (id) => async (dispatch) => {
  dispatch({
    type: "LOADING_PROMO",
  });

  const promoData = await axios.get(get_promos(id));
 
  dispatch({
    type: "GET_DETAIL",
    payload: {  
      promo: promoData.data.promo,
    },
  });
};

虽然它确实会在调度操作时返回促销数据,但问题是在调度的某些情况下,不会返回任何数据。以下是来自redux devtools的截图,以显示我的意思:

我试图得到所有新动漫的宣传片,我希望得到50个宣传片数据。在devtools中,你可以看到我只有9个。接着是错误429 (请求太多):

如何解决此问题?有没有更好的方法来做到这一点,因为这似乎是一种糟糕的做法:

EN

回答 1

Stack Overflow用户

发布于 2021-07-26 14:58:52

看起来你受到api本身和每单位时间请求数阈值的限制。可能应该有一个请求,允许您传递多个动漫in来获取请求,以避免单独请求每个动漫的详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68524710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档