取消ajax通话?

时间:2016-11-30 22:09:10

标签: ajax django select2

我正在使用Django项目中的Select2选择框。如果您只在查询框中输入了一两个字符,那么ajax调用它可能会非常耗时,但如果您输入了多个字符,则会更快。所以我看到的是你将开始输入一个查询,它将进行4或5个ajax调用,但最后一个返回并显示结果。它在屏幕上看起来很好,但与此同时,服务器仍然在早期的查询中流失。我已经将“延迟”参数增加到500毫秒,但这仍然是一个问题。

有没有办法让服务器上的AJAX处理程序检测到这是来自同一客户端的新请求,而不是当前处理的请求,并告诉旧版本立即退出?从阅读其他答案看来,仅在客户端调用.abort()并不会停止在服务器端运行查询。

1 个答案:

答案 0 :(得分:1)

如果它们是占用时间的数据库查询,那么除了停止数据库服务器之外基本上什么也不会阻止它们,这当然不是有形的。例如,如果它是嵌套循环中的计算,那么您可以使用缓存来检测是否已从同一用户提交了另一个请求。基本上:

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});
    }
}