美文网首页Web前端之路
Ajax 多次异步请求分析

Ajax 多次异步请求分析

作者: oNexiaoyao | 来源:发表于2020-06-17 10:57 被阅读0次
  • 现象

    鼠标滑过列表发出请求,在页面上显示请求结果。鼠标一次性滑过多个列表项,发出多个请求,请求返回结果有时间查导致页面显示出现闪烁。

  • 影响

    页面显示闪烁,视觉显示不好看,交互不友好

  • 解决方法

    • 取消之前的请求响应

      在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 多次异步请求分析

    现象鼠标滑过列表发出请求,在页面上显示请求结果。鼠标一次性滑过多个列表项,发出多个请求,请求返回结果有时间查导致页...

  • Django项目运行时出现self.status.split('

    这个错误是因为多次刷新,ajax多次进行请求,而且请求数据过大导致。ajax默认异步请求,改成同步可以解决问题。

  • 2018-12-28

    简单爬虫项目(二) 对数据资源使用ajax异步请求网站进行爬取的几种方式 请求分析详见ajax请求分析 Phant...

  • setTimeout this指向问题

    今天的需求是防止多次提交请求------于是模拟ajax异步请求,用setTimeout代替,更改标识, subm...

  • Python 爬虫-异步加载

    主要内容有:1,AJAX 技术介绍2,JSON介绍与应用3,异步GET与POST请求4,特殊的异步加载5,多次请求...

  • 玩转AJAX

    title: 玩转AJAXtags: AJAX 异步请求categories: AJAX 异步请求 客户端向服务器...

  • jquery AJAX方法

    $ajax()执行异步 AJAX 请求 $.ajaxSetup()为将来的 AJAX 请求设置默认值 $.get(...

  • jQuery Ajax 操作函数

    jQuery.ajax() 执行异步 HTTP (Ajax) 请求。 .ajaxComplete() 当 Ajax...

  • ajax 是什么?ajax 的交互模型?同步和异步的区别?

    ajax是支持异步请求数据,用户体验较强的技术 Ajax 的交互模型(Ajax的过程): 1.用户发出异步请求 2...

  • Ajax get请求GitHub API接口

    AJAX用于异步请求。AJAX = 异步 JavaScript 和 XML。 AJAX 是一种用于创建快速动态网页...

网友评论

    本文标题:Ajax 多次异步请求分析

    本文链接:https://www.haomeiwen.com/subject/iqijxktx.html