【问题标题】:Cancel ajax calls?取消 ajax 调用?
【发布时间】:2016-11-30 22:09:10
【问题描述】:

我在我的 Django 项目中使用Select2 选择框。如果您只在查询框中输入了一个或两个字符,它进行的 ajax 调用可能会相当耗时,但如果您输入了几个字符,则执行速度会更快。所以我看到的是你将开始输入一个查询,它会进行 4 或 5 次 ajax 调用,但最后一个会返回并显示结果。它在屏幕上看起来不错,但与此同时,服务器仍在处理早期的查询。我已经将“延迟”参数增加到 500 毫秒,但还是有点问题。

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

【问题讨论】:

    标签: ajax django select2


    【解决方案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});
        }
    }
    

    【讨论】:

    • 什么,究竟是什么设置了缓存中的值?
    • @PaulTomblin 哎呀,更新了答案。无论如何,它本来应该是随机的伪代码来开始你的想法,但这种东西实际上也应该起作用。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多