为了账号安全,请及时绑定邮箱和手机立即绑定

Django - AJAX Fetch 发送每个输入字母的请求

Django - AJAX Fetch 发送每个输入字母的请求

鸿蒙传说 2023-11-02 16:37:03
这可能与应有的方式相去甚远,我正在不断学习,这是我第一次尝试这样的事情。问题:即使使用 setTimeout 函数,服务器也会为我写的每个字母发送响应,尽管我希望它等待用户停止键入并只获取完成的单词我的模板中的脚本:lookup.addEventListener('keyup', e => {        let searchValue = e.target.value;    if (searchValue.length > 4){      setTimeout(() => {             fetch(`{% url 'find_book' %}?param=${e.target.value}` )          .then(res => res.json())          .then(data => console.log(data))          .catch(err => console.log(err))}, 2000);        }views.py@api_view(['GET'])def find_book(request):    param = request.GET.get("param")    if param:        url = f'https://www.googleapis.com/books/v1/volumes?q=intitle:{param}&key=xxx'        r = requests.get(url)                if r.status_code == 200:            data = r.json()            return Response(data, status=status.HTTP_200_OK)        else:            return Response({"error": "Request failed"}, status=r.status_code)    else:        return Response({}, status=status.HTTP_200_OK)
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

将超时 ID 存储到高于您的事件监听器范围内的变量。当事件触发时 - 检查是否超时并清除它(这意味着如果尚未执行则取消请求)


例子:


let delayedFetch;


lookup.addEventListener('keyup', e => {

    

    let searchValue = e.target.value;


    if (searchValue.length > 4){


      if (delayedFetch) clearTimeout(delayedFetch);


      delayedFetch = setTimeout(() => {

     

        fetch(`{% url 'find_book' %}?param=${e.target.value}` )

          .then(res => res.json())

          .then(data => console.log(data))

          .catch(err => console.log(err))}, 2000);

        }


查看完整回答
反对 回复 2023-11-02
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信