javascript - Django - AJAX Fetch 为每个输入字母发送请求
问题描述
这可能远非应该如何完成,我在旅途中学习,这是我第一次尝试这样的事情。
问题:即使使用 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);
}
视图.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)
解决方案
将超时 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);
}
推荐阅读
- sygic - onBackBtn=minimize 不会改变后退按钮的行为
- fortran - 设备上的 OpenACC 重复数组
- google-apps-script - Publish Sheet 插件始终显示对话框“转到 G Suite Marketplace SDK...”
- python - 不使用 Selenium 登录 Instagram
- r - gsub 不考虑?(问号)在执行时
- r - 使用分组变量和 geom_rect
- c# - SqlBulkTools 的动态使用
- flutter - 为什么不能直接使用泛型值,但如果从 Dart 中的方法返回则相同
- javascript - 映射状态时如何重新呈现复选框状态
- python - 元组列表中的字典理解