首页 >社区问答列表 >javascript - 怎样解决ajax请求返回的时序问题

javascript - 怎样解决ajax请求返回的时序问题

一般我们用ajax实现的autocomplete系统,随着用户的输入我们向后端发出去的请求依次应该是

autocomplete?q=j
autocomplete?q=java
autocomplete?q=javasc

如果遇到网络延时比较严重,当我们处理完q=javasc的请求后,q=j的请求才返回过来,那么如果不做任何处理这个时候就会显示q=j的结果,显然这是不合理的,大家一般是怎么处理这种问题的呢?

有人可能会想,用延时触发,其实这根本不能解决问题,延时触发只能减少请求的频率,但是如果你请求返回的时间超过了延时的时间,照样会产生错乱.

  • 阿神
  • 阿神    2017-04-10 12:44:564楼

    其实方法很简单:终止前一个请求并删除此请求:

    // when keyup
    if (lastXhr) {
        lastXhr.abort();
        delete lastXhr;
    }
    ...

    这样做还有两个优点:

    1. 可以防止打字太快导致浪费许多请求(比如用户很快把java打出来,其实j,ja,jav的请求都不需要了),
    2. 可以防止因为突然间收到很多提示结果导致提示框乱闪

    +0添加回复

  • 回复
  • 大家讲道理
  • 大家讲道理    2017-04-10 12:44:563楼

    • 目前大多自动完成是通过用户输入来延迟查询频率的,每次请求可以加上loading状态,让用户知道自动完成在处理请求.
    • 在请求里加上时间戳,以比较返回时间是否超出预期,如果超出预期且当前词与请求里的词不一致则忽略掉返回结果.
    • 最好的办法是换个速度快点的服务器,优化服务端处理时间,快速完成用户的请求.

    +0添加回复

  • 回复
  • 迷茫
  • 迷茫    2017-04-10 12:44:562楼

    我是这么处理的,首先你肯定是要记录每次输入的事件,每次输入之后放入到一个数组中,如

    var key_arr = [];
    key_arr.push('j');
    //依次类推
    key_arr.push('ja');
    key_arr.push('jav');
    key_arr.push('java');
    //end
    
    //然后在ajax回调函数里面就很好判断了,我们在ajax返回值里面把查询的关键词也返回来,然后如下判断
    if(data.keyword == key_arr.pop()){
    //处理原有的逻辑
    }

    实际上就是只处理最后输入的那个关键词的ajax回调函数逻辑,实现可能不太优雅呵呵

    +0添加回复

  • 回复
  • 小皮
  • 小皮    2017-04-10 12:44:561楼

    以前我也想过这个问题

    简单的方法就用一个数组来保持执行顺序,如果是需要执行的时候就执行,否则插入到对应顺序的位置,等待前一个回调执行完成。搞个队列吧

    +0添加回复

  • 回复