主动中断请求

简介: For 体验: 很多时候,请求后台接口比较慢,还在等待返回。如果此时用户选择了切换页面,这时候我们可以选择将还在进行中的请求主动中断。jQuery参考//可以在通用的入口abort()掉requestvar request = $.ajax({ type: 'POST', url: 'someurl', success: functi

For 体验: 很多时候,请求后台接口比较慢,还在等待返回。如果此时用户选择了切换页面,这时候我们可以选择将还在进行中的请求主动中断。

jQuery

参考

//可以在通用的入口abort()掉request
var request = $.ajax({
  type: 'POST',
  url: 'someurl',
  success: function(result){}
});

request.abort();

Angular1.x

$http
$q
$http(config)

angular.module('app.services', [])
// 发送中的请求
.factory('PendingRequests', [
  function(){
    var list = []; // 私有变量
    return {
      push: function(canceller){
        list.push(canceller);
      },
      remove: function(canceller){
        var index = _.indexOf(list, canceller);
        if (index > -1) {
          list.splice(index, 1);
        }
      },
      clear: function(){
        _.forEach(list, function(item){
          item.resolve();
        });
        list = [];
      }
    };
  }
])

// 请求包装
.factory('RequestWrapper', [
          '$q', '$http', 'PendingRequests',
  function($q ,  $http ,  PendingRequests){
    function wrapper(type, config, options){
      // 自动中断的canceller
      var canceller;
      // 主动传入 `timeout` 不自动中断
      if (!config.hasOwnProperty('timeout')) {
        canceller = $q.defer();
        config.timeout = canceller.promise;
      }

      var req = $http(config);
      if (canceller) {
        PendingRequests.push(canceller);
      }

      var defer = $q.defer();
      req.then(function(res){
        var match = type === 'array' ?
            angular.isArray(res.data) :
            angular.isObject(res.data) && !angular.isArray(res.data);
        if (match) {
          defer.resolve(res.data);
        } else {
          res.TypeError = true;
          defer.reject(res);
        }
      }, function(res){
        defer.reject(res);
        if (res.status === 0) {
          // 请求主动中断
          return;
        }
      });

      if (canceller) {
        // 请求已完成,从 pending 中移除
        req['finally'](function(){
          PendingRequests.remove(canceller);
        });
      }
      return defer.promise;
    }

    // array 或 object 两种返回
    return {
      array: function(req, options){
        return wrapper('array', req, options);
      },
      object: function(req, options){
        return wrapper('object', req, options);
      }
    };
  }
])
目录
相关文章
|
存储 关系型数据库 分布式数据库
PolarDB 安装与配置 | 学习笔记
快速学习 PolarDB 安装与配置
PolarDB 安装与配置 | 学习笔记
|
10月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力RT-DETR精度提升
RT-DETR改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力RT-DETR精度提升
274 10
RT-DETR改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力RT-DETR精度提升
|
9月前
|
人工智能 搜索推荐
新手指南:claude 3.7 sonnet国内使用教程
Claude 3.7是Claude 3.5的更新版本,拥有更强的理解和生成能力
|
11月前
|
数据挖掘 BI 数据安全/隐私保护
三大CRM品牌深度评测:销售易、悟空、超兔
**销售易CRM**:专为中国市场设计,提供强大的本土化服务和定制化解决方案,涵盖客户管理、销售自动化、市场营销、服务支持及数据分析等功能。 **悟空CRM**:以“智慧、灵活、高效”为核心,用户界面友好,支持销售、营销和服务的全面自动化,并具备高级数据分析和协作工具。 **超兔CRM**:专注于数据分析和集成性,提供360度客户视图、销售自动化、市场营销、客户服务及安全性保障,适用于各种规模的企业。 通过对比三者的功能和优势,企业可以更明智地选择适合自己的CRM系统,从而更好地管理客户关系,提升业务绩效。
|
机器学习/深度学习 数据采集 Python
Python机器学习面试:Scikit-learn基础与实践
【4月更文挑战第16天】本文探讨了Python机器学习面试中Scikit-learn的相关重点,包括数据预处理(特征缩放、缺失值处理、特征选择)、模型训练与评估、超参数调优(网格搜索、随机搜索)以及集成学习(Bagging、Boosting、Stacking)。同时,指出了常见错误及避免策略,如忽视数据预处理、盲目追求高精度、滥用集成学习等。掌握这些知识点和代码示例,能帮助你在面试中展现优秀的Scikit-learn技能。
213 5
|
JavaScript
vue项目中升级element ui(含常见报错及解决方案,如表格不显示,el-table无效, “__v_isRef“ is not defined,Use :deep() instead)
vue项目中升级element ui(含常见报错及解决方案,如表格不显示,el-table无效, “__v_isRef“ is not defined,Use :deep() instead)
324 0
|
机器学习/深度学习 存储 人工智能
文本的检测、识别实战:使用 Tesseract 进行 OpenCV OCR 和文本识别
文本的检测、识别实战:使用 Tesseract 进行 OpenCV OCR 和文本识别
1034 0
文本的检测、识别实战:使用 Tesseract 进行 OpenCV OCR 和文本识别
|
Python
在Python中,字典(dictionary)的键(key)具有唯一标识性
在Python中,字典(dictionary)的键(key)具有唯一标识性
1130 1
npm install 太慢?解决方法
npm install 太慢?解决方法
11473 0