-
现象
鼠标滑过列表发出请求,在页面上显示请求结果。鼠标一次性滑过多个列表项,发出多个请求,请求返回结果有时间查导致页面显示出现闪烁。
-
影响
页面显示闪烁,视觉显示不好看,交互不友好
-
解决方法
-
取消之前的请求响应
在ajax请求未响应之前可以使用
xhr.abort()
取消,但如果发出的请求已经到达了服务器,这种终止只是让浏览器不在监听这个请求的响应,服务器端仍然会进行处理。使用 abort() 取消后会进入 error 回调函数// 定义请求对象 var getCategoryInfoAjax = null; function getCategoryInfo() { if (getCategoryInfoAjax) { // 不为 null 说明之前请求过,需要取消请求 getCategoryInfoAjax.abort(); } getCategoryInfoAjax = $.ajax({ type: "POST", contentType: "application/x-www-form-urlencoded;charset=utf-8", url: url, data: param, success: function (result, testStatus) { // 也可以在这里判断 ajax 请求是否存在来决定是否执行回调函数 }, complete: function (xhr, xs) { xhr = null; }, error: function (xmlHttpRequest, textStatus, errorThrown) { if (xmlHttpRequest.statusText === 'abort') { // 说明是主动中断,不作出提示 } else { layer.msg('失败'); } } }); }
缺点:使用封装好的 ajax 方法,如果出现需要多个请求同时进行的情况,那么使用
abort()
取消请求会使其他请求终止。优点:重复多次请求的情况下,我们可以抛弃之前所有的请求响应,获得最后一次的请求响应。
-
忽略之前的所有请求,保留最新一次的请求
创建计数器,利用闭包技术来判断是否当前的ajax请求与响应返回是同一批次的。
// 定义计数器 var xhrCount = 0; function getCategoryInfo() { var seqNum = ++xhrCount; getCategoryInfoAjax = $.ajax({ type: "POST", contentType: "application/x-www-form-urlencoded;charset=utf-8", url: url, data: param, success: function (result, testStatus) { if (seqNum === xhrCount) { // 请求和响应属于同一批次的 } else { // 不相等说明请求和响应不是同一批次 } }, complete: function (xhr, xs) { xhr = null; }, error: function (xmlHttpRequest, textStatus, errorThrown) { layer.msg('失败'); } }); }
-
Ajax 多次异步请求分析
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- (重要知识点) 通过 HTTP 请求加载远程数据。(优点:比较方便使用) jQuery 底层 AJAX 实现。简单...
- jQuery 发送的所有 Ajax 请求,内部都会通过调用 $.ajax()函数来实现。通常没有必要直接调用这个函...