You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

快速输入/退格时Jikan API请求重复执行,空输入仍显结果的问题

问题原因与修复方案

问题原因

1. 快速输入/退格导致结果超20条

每一次输入或退格操作都会触发fetch请求,但网络请求是异步的。快速操作时,前一个请求还未完成,新请求就已发起。如果旧请求的响应晚于新请求返回,旧结果会被追加或覆盖到容器中,最终累计超过20条。核心问题是没有做防抖处理,也没有取消未完成的旧请求,导致多轮请求的结果都被渲染。

2. 退格至空字符串仍显示动漫

代码未处理搜索关键词为空的场景:要么在输入框为空时仍发起了API请求(Jikan API在空关键词时可能返回热门动漫),要么没有清空之前渲染的结果容器,导致旧内容残留。

修复方案

1. 解决重复请求与结果溢出

  • 添加防抖逻辑:设置300ms左右的延迟,只有用户停止输入超过这个时间才发起请求,避免频繁触发。示例代码:
    let debounceTimer;
    function handleSearch(inputVal) {
      clearTimeout(debounceTimer);
      debounceTimer = setTimeout(() => {
        inputVal.trim() ? fetchAnime(inputVal) : clearAnimeContainer();
      }, 300);
    }
    
  • 用AbortController取消旧请求:发起新请求前,终止上一个未完成的请求,确保只有最新请求的结果被处理。示例代码:
    let abortController;
    async function fetchAnime(query) {
      if (abortController) abortController.abort();
      abortController = new AbortController();
      try {
        const res = await fetch(`https://api.jikan.moe/v4/anime?q=${query}&limit=20`, {
          signal: abortController.signal
        });
        const data = await res.json();
        renderAnimeList(data.data);
      } catch (err) {
        if (err.name !== 'AbortError') console.error('搜索失败:', err);
      }
    }
    

2. 解决空字符串残留结果

  • 在搜索逻辑中优先判断输入是否为空:如果为空,直接清空容器,不发起API请求。
  • 实现清空容器的函数:
    function clearAnimeContainer() {
      document.getElementById('anime-container').innerHTML = '';
    }
    
  • 确保在输入框内容变为空时,立即调用clearAnimeContainer,而不是继续执行搜索流程。

内容的提问来源于stack exchange,提问作者Dermot Wheethin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:10:49