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

Vue项目频繁触发YouTube API超配额,如何等待用户输入完成再请求?

解决方案

你这个场景用防抖(debounce) 逻辑即可实现需求:设置一个等待阈值(通常200~500ms),只有用户停止输入达到阈值时间后才会发起请求,只要用户在阈值内继续输入就会重置计时,不会重复触发请求,能大幅降低API调用次数。

方案1:手写防抖实现(无需额外依赖)

修改App.vue代码

<template>
  <SearchBar @emitTermSearch="onTermSearch"></SearchBar>
  <VideoList :videos="videos"></VideoList>
</template>

<script>
import axios from "axios";
import SearchBar from "./components/SearchBar";
const API_KEY = "hidden";
export default {
  name: "App",
  components: {
    SearchBar
  },
  data() {
    return {
      videos: [],
      requestTimer: null // 新增防抖计时器变量
    };
  },
  methods: {
    onTermSearch(emitTermSearch) {
      // 每次输入先清空之前的计时器,取消未执行的请求
      clearTimeout(this.requestTimer)
      // 重新设置计时器,300ms后无新输入再发起请求
      this.requestTimer = setTimeout(() => {
        axios
        // 原代码此处缺少右括号,已补全
        .get("https://www.googleapis.com/youtube/v3/search", {
          params: {
            key: API_KEY,
            type: "video",
            part: "snippet",
            maxResults: 2,
            order: "date",
            q: emitTermSearch
          }
        }).then(response => {
          this.videos = response.data.items;
        }).catch(err => {
          console.log(err);
        });
      }, 300) // 可自行调整延迟时间,单位为ms
    }
  }
};
</script>

SearchBar.vue无需修改即可正常运行。

方案2:用lodash防抖方法(项目已引入lodash时可选)

如果项目已经安装了lodash依赖,可直接调用封装好的debounce方法,代码更简洁:

<script>
import axios from "axios";
import { debounce } from 'lodash'
import SearchBar from "./components/SearchBar";
const API_KEY = "hidden";
export default {
  name: "App",
  components: {
    SearchBar
  },
  data() {
    return {
      videos: []
    };
  },
  methods: {
    // 直接用debounce包裹请求逻辑,设置300ms延迟
    onTermSearch: debounce(function(emitTermSearch) {
      axios
      .get("https://www.googleapis.com/youtube/v3/search", {
        params: {
          key: API_KEY,
          type: "video",
          part: "snippet",
          maxResults: 2,
          order: "date",
          q: emitTermSearch
        }
      }).then(response => {
        this.videos = response.data.items;
      }).catch(err => {
        console.log(err);
      });
    }, 300)
  }
};
</script>

300ms的延迟用户几乎感知不到,但可以把连续输入10个字符的10次请求合并为1次,能极大降低API配额消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:18:03