要取消 ajax 个通话吗?
Cancel ajax calls?
我在我的 Django 项目中使用 Select2 select 框。如果您只在查询框中输入了一两个字符,它调用 ajax 可能会相当耗时,但如果您输入了多个字符,调用速度会更快。所以我看到的是您将开始输入一个查询,它将进行 4 或 5 次 ajax 调用,但最后一次调用 returns 并显示结果。它在屏幕上看起来不错,但与此同时,服务器仍在处理较早的查询。我已经将 "delay" 参数增加到 500 毫秒,但它仍然有点问题。
有没有办法让服务器上的 AJAX 处理程序检测到这是来自与当前正在处理的客户端相同的客户端的新请求,并告诉旧客户端立即退出?从这里阅读其他答案看来,仅在客户端调用 .abort()
不会停止服务器端的查询 运行。
如果它们是正在占用时间的数据库查询,那么除了停止数据库服务器之外基本上没有什么可以阻止它们,这当然是无形的。例如,如果它是嵌套循环中的计算,那么您可以使用缓存来检测是否已从同一用户提交了另一个请求。基本上:
from django.core.cache import cache
def view(request):
start_time = timestamp # timezone.now() etc.
cache.set(request.session.session_key + 'some_identifier', start_time)
for q in werty:
# Very expensive computation with millions of loops
if start_time != cache.get(request.session.session_key + 'some_identifier'):
break
else:
# Continue the nasty computations
else:
cache.delete(request.session.session_key + 'some_identifier')
但 Django 部分放在一边 - 我会做的是:在 JS 中添加一个条件,当搜索词少于 3 个字符时,它会在搜索之前等待 0.5 秒(或更少,无论你喜欢什么)。如果添加了另一个字符,则立即搜索。
即
var timeout;
function srch(param) {
timeout = false;
if (param.length < 3) {
timeout = true;
setTimeout(function () {
if (timeout) {
$.ajax({blah: blah});
}
}, 500);
} else {
$.ajax({blah: blah});
}
}
我在我的 Django 项目中使用 Select2 select 框。如果您只在查询框中输入了一两个字符,它调用 ajax 可能会相当耗时,但如果您输入了多个字符,调用速度会更快。所以我看到的是您将开始输入一个查询,它将进行 4 或 5 次 ajax 调用,但最后一次调用 returns 并显示结果。它在屏幕上看起来不错,但与此同时,服务器仍在处理较早的查询。我已经将 "delay" 参数增加到 500 毫秒,但它仍然有点问题。
有没有办法让服务器上的 AJAX 处理程序检测到这是来自与当前正在处理的客户端相同的客户端的新请求,并告诉旧客户端立即退出?从这里阅读其他答案看来,仅在客户端调用 .abort()
不会停止服务器端的查询 运行。
如果它们是正在占用时间的数据库查询,那么除了停止数据库服务器之外基本上没有什么可以阻止它们,这当然是无形的。例如,如果它是嵌套循环中的计算,那么您可以使用缓存来检测是否已从同一用户提交了另一个请求。基本上:
from django.core.cache import cache
def view(request):
start_time = timestamp # timezone.now() etc.
cache.set(request.session.session_key + 'some_identifier', start_time)
for q in werty:
# Very expensive computation with millions of loops
if start_time != cache.get(request.session.session_key + 'some_identifier'):
break
else:
# Continue the nasty computations
else:
cache.delete(request.session.session_key + 'some_identifier')
但 Django 部分放在一边 - 我会做的是:在 JS 中添加一个条件,当搜索词少于 3 个字符时,它会在搜索之前等待 0.5 秒(或更少,无论你喜欢什么)。如果添加了另一个字符,则立即搜索。
即
var timeout;
function srch(param) {
timeout = false;
if (param.length < 3) {
timeout = true;
setTimeout(function () {
if (timeout) {
$.ajax({blah: blah});
}
}, 500);
} else {
$.ajax({blah: blah});
}
}