axios关于针对请求时长策略设计的思考

前言

在我们的业务请求中,有很多时候会针对有不同时长的需求策略性设置。这里针对这个需求进行详细的展开。

针对这种情况,我们的timout的一般是根据请求地址来的,所以核心处理技巧便是如何根据不同的request地址去设置不同的timeout.

我们之前设置的请求时长是十秒,并且是通过create的部分,整个项目只有一个instance的。

let _axios = axios.create({baseURL: apiProxyUrl,headers: { 'Content-Type': 'application/json' },transformRequest: [transformRequest],timeout: 10000 
})
复制代码

那么既然需要处理request的地址部分,我建议针对长时长的地址单独一个文件维护,考虑到了以下两点:

1 请求地址变多时,可以更好的定位以及维护
2 需要时,可以针对不同的微服务进行进一步的管理和配置
3 与下面请求时长的策略部分进行解耦
复制代码

主要结果是返回一个期望长时长地址的数组。

/*** @author robin* @description maintain all long time api request paths*//*** 用户服务长时长地址数组*/
const userApiPaths = [] /*** 报表服务长时长地址数组,如果你的微服务地址符合一个规律,可以这里进行方法定义并返回*/
const getTablesApiPaths = ()=>{return []
}export default ['/house/list/houseSpaceInHouseSpaceManager'
].concat(userApiPaths).concat(getTablesApiPaths())
复制代码

简单处理

我们知道axios本身的request支持拦截器的配置,那么我们可以进行以下简单的设置。

import longTimeApiEnum from './longTimeApiEnum'
// 请求拦截器
_axios.interceptors.request.use((config) => { // 请求时长10分钟const LONG_TIMEOUT = 600000 if (longTimeApiEnum.some(url => config.url.includes(url))) {config.timeout = LONG_TIMEOUT}return config
})
复制代码

此方法适用于大部分请求地址没有规律性,适合用枚举维护相应地址的。

策略模式处理

当然如果你的长时长的api地址具有一定的正则可匹配性,也可以用正则来写,并且把判断的部分用策略模式独立为一个方法,甚至一个文件。

比如下面的例子:

// 根据微服务一级地址判断
function judgeIsLongTimeApi(url){const strategy = {'user':function(url){if(url.includes('/users/data')) return true;return false},'table':function(url){if(url.includes('/table')) return true;return false}}const firstPath = url.split('/')[1];return strategy[firstPath] && strategy[firstPath](url);}// 使用
const LONG_TIMEOUT = 600000 if (judgeIsLongTimeApi(config.url)) {config.timeout = LONG_TIMEOUT}
复制代码

复杂的类处理

感觉上面的方式不够逼格,或者有时候不是这么简单的改一个timeout,还需要改很多配置,比如说baseUrl等等。那么你需要定义一个class。然后根据你的需求去自定义每个子类。大概是这样的:这里用到了class继承。

import axios from 'axios';
class Api{constructor(){}nessaryFn(){throw Error('必须要实现的函数')}}class usualApi extends Api {constructor(){}nessaryFn(){//codes here}
}class specialApi extends Api {constructor(){}nessaryFn(){//codes here}
}// 再来一个策略模式 根据不同的情况 ,返回使用不同的api实现子类。复制代码

小结

以上就是全部的关于axios部分的自定义维护时做的思考和实践,已经完整的解决了自己的需求。

其他问题

  • 当axios的请求返回类型为非json类型,需要针对url进行特殊化配置的时候,相应的思路也是如此。
    if (exportXlsEnum.some(url  =>  config.url.includes(url))) {
    config.responseType  =  'blob'
    }
    复制代码

转载于:https://juejin.im/post/5c95d481f265da60e65b9c66

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private Point mPoint; 2.给窗体等控件增加MouseDown…

Python 字典删除元素clear、pop、popitem

同其它python内建数据类型一样,字典dict也是有一些实用的操作方法。这里我们要说的是字典删除方法:clear()、pop()和popitem(),这三种方法的作用不同,操作方法及返回值都不相同。接下来就来查看下这些字典特定方法的具体用法是什么…

reactor模式:多线程的reactor模式

上文说到单线程的reactor模式 reactor模式:单线程的reactor模式 单线程的reactor模式并没有解决IO和CPU处理速度不匹配问题,所以多线程的reactor模式引入线程池的概念,把耗时的IO操作交由线程池处理,处理完了之后再同步到selecti…

Elasticsearch实战篇——Spring Boot整合ElasticSearch

2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容…

C#:Dockpanel的一些入门的基本操作

原文链接: 一、引用: 1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1(此处默认为主窗体)。 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。 3.设置Form1窗体属性IsMdiContainer…

MyBatis中if,where,set标签

<if>标签 <select id"findActiveBlogWithTitleLike"resultType"Blog">SELECT * FROM BLOG WHERE state ‘ACTIVE’ <if test"title ! null">AND title like #{title}</if> </select> if标签通常伴随着where,set…

Python3基础 __repr__ 类的实例对象的名字 可以打印文字(1)

引用自&#xff1a;http://www.bubuko.com/infodetail-1918622.html 这个__repr__的作用从下边的例子中可以看出,返回实例化对象的表达 code: class MyClass() :def __str__(self) :return "我是MyClass的一个实例"def __repr__(self) :return "这回连print都省…

Day03:文件打开;错误处理

错误处理 try: #要执行的代码 except 错误的类型&#xff08;可选&#xff09;: #发生错误时执行的代码 finally: #有没有发生错误都执行的代码 复制代码with open() as 变量名&#xff1a; with提供一种叫上下文管理协议的python技术&#xff0c;系统会自动关闭文件 open() 默…

Python: pip升级报错了:You are using pip version 10.0.1, however version 20.3.3 is available.

1,Python使用命令&#xff1a;python -m pip install --upgrade pip升级pip的时候报了下面这个错 2,换了个命令&#xff1a; python -m pip install --upgrade pip -i https://pypi.douban.com/simple 更新成功了&#xff0c;但又报了一个新的错误&#xff1a; AttributeError:…

新手上路之Hibernate:第一个Hibernate例子

一、Hibernate概述 &#xff08;一&#xff09;什么是Hibernate&#xff1f; Hibernate核心内容是ORM&#xff08;关系对象模型&#xff09;。可以将对象自动的生成数据库中的信息&#xff0c;使得开发更加的面向对象。这样作为程序员就可以使用面向对象的思想来操作数据库&…

模板标签及模板的继承与引用

1.常用的模板标签 - 作用是什么:提供各种逻辑 view.py: def index(request):#模板标签 --常用标签 总结&#xff1a;语法 {% tag %} {% endtag %} {% tag 参数 参数 %} 示例 展示页index.html&#xff0c;包含for标签&#xff0c;if标签&#xff0c;url标签 {% extends teacher…

文件夹操作之创建

创建文件夹可通过Directory类的CreateDirectory方法来实现格式为&#xff1a;Directory.CreateDirectory(“文件路径”)&#xff1b;String path“C:\Users\Administrator\Desktop\51zxw”&#xff1b; If&#xff08;Directory.exists&#xff08;path&#xff09;&#xff09…

doxygen

http://www.doxygen.nl/转载于:https://www.cnblogs.com/zengkefu/p/7383793.html

C#:RichTextBox 追加其它颜色的行列

1、新建静态扩展方法public static class RichTextBoxExtension{public static void AppendTextColorful(this RichTextBox rtBox, string text, Color color, bool addNewLine true){if (addNewLine){text Environment.NewLine;}rtBox.SelectionStart rtBox.TextLength;rtB…

Golang实现一个密码生成器

小地鼠防止有人偷他的果实&#xff0c;在家里上了一把锁。这个锁怎么来的呢&#xff1f;请往下看。。 package mainimport ("flag""fmt""math/rand""time" )var (length intcharset string )const (NUmStr "0123456789"C…

Java基础知识(二)

1、String、StringBuffer、StringBuilder 操作少量数据->String单线程操作字符串缓冲区下操作大量数据->StringBuilder多线程操作字符串缓冲区下操作大量数据->StringBuffer可变性&#xff1a;String类中使用final关键字private final char value[]&#xff0c;所以St…

C# WPF:初识布局容器

StackPanel堆叠布局 StackPanel是简单布局方式之一&#xff0c;可以很方便的进行纵向布局和横向布局 StackPanel默认是纵向布局的 <Window x:Class"WpfApplication1.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" …

Kibana源码分析--Hapijs路由设置理解笔记

【ES6解构赋值】&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment 【Joi APi】&#xff1a;https://github.com/hapijs/joi/blob/v13.1.2/API.md 转载于:https://www.cnblogs.com/lishidefengchen/p/866874…

Python打包EXE神器 pyinstaller

最近由于项目需要&#xff0c;以前的python文件需要编辑为EXE供前端客户使用。 由于最早接触的是distutils&#xff0c;所以一开始准备使用distutils和py2exe搭配来进行python的exe化&#xff0c;也就是传统的使用setup.py的方式来进行exe安装。但是结果都不是很好&#xff0c;…

好程序员HTML5前端教程-css的引入方式和选择器

好程序员HTML5前端教程-css的引入方式和选择器 01.引入css方式&#xff08;重点掌握&#xff09; 行内样式 内接样式 外接样式      3.1 链接式      3.1 导入式 css介绍 现在的互联网前端分三层&#xff1a; HTML&#xff1a;超文本标记语言。从语义的角度描述页面结…