当前位置: 首页 > news >正文

手表网站制作照片重庆网站建设推广

手表网站制作照片,重庆网站建设推广,搭建b2c网站,nodejs网站开发实例这两个功能都是用拦截器实现。 前景提要: ts 简易封装 axios,统一 API 实现在 config 中配置开关拦截器 全局错误处理 在构造函数中,添加一个响应拦截器即可。在构造函数中注册拦截器的好处是,无论怎么实例化封装类&#xff0c…

在这里插入图片描述

这两个功能都是用拦截器实现。

前景提要:
ts 简易封装 axios,统一 API
实现在 config 中配置开关拦截器

全局错误处理

在构造函数中,添加一个响应拦截器即可。在构造函数中注册拦截器的好处是,无论怎么实例化封装类,这个错误拦截器都会被注册进实例。

其中有个注意点,就是请求取消。取消请求会导致响应 promise 状态为 rejected,这样就会触发响应拦截器的 onRejected 回调。因此要单独处理请求的请求情况,将它与请求错误区分开来。

class HttpRequest {private readonly instance: AxiosInstance;constructor(config: MyAxiosRequestConfig) {this.instance = axios.create(config);// axios http 错误处理(超出 2xx 范围的 http 状态码都会触发该函数)this.instance.interceptors.response.use(null, (error: AxiosError) => {// 手动取消请求会导致“错误”触发if (error.message === "canceled") alert("请求取消成功");const { response } = error;// 1. 请求超时 && 网络错误单独判断,因为没有 responseif (error.message.indexOf("timeout") !== -1) alert("请求超时!请您稍后重试");if (error.message.indexOf("Network Error") !== -1) alert("网络错误!请您稍后重试");// 2. 根据 http 服务器响应的错误状态码,做不同的处理if (response) {switch (response.status) {case 404:alert("你所访问的资源不存在!");break;case 500:alert("服务异常!");break;default:alert("请求失败!");}}// 3. 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:也可以跳转到断网页面if (!window.navigator.onLine) alert("服务器错误或者无网络"); // router.replace("/500");throw error;});}
}

取消请求

axios 取消请求的方式

axios 取消请求有两种 api。一种是 AbortController,一种是古老的 CancelToken ,已经被弃用了。

AbortController - Web API 接口参考 | MDN

我们主要使用第一种方式:

  1. 实例化取消控制器接口,控制器对象有一个信号标记signal
  2. 将该标记配置给 axios 同名的 signal配置
  3. 控制器对象调用abort()方法就能取消被标记了的请求。
const controller = new AbortController();axios.get('/foo/bar', {signal: controller.signal
}).then(function(response) {//...
});
// 取消请求
controller.abort()

封装取消请求功能

取消请求也是个基础功能,因此和全局错误拦截器一样在构造函数中注册拦截器。

取消请求:

  1. 为每一个请求生成一个控制器 controller,并添加 signal
  2. 维护一个 map,以 url 为 key,对应的 controller 为 value
  3. 要取消哪个请求就通过 url,获取它的 controller 来取消
  4. 在全局响应拦截器中,给所有请求添加 signal,并在请求结束后从 map 中剔除该 url 对应的 controller

封装类暴露两个方法:

  1. 取消全部请求
  2. 根据 url 取消请求
class HttpRequest {private readonly instance: AxiosInstance;private readonly abortControllerMap: Map<string, AbortController>;constructor(config: MyAxiosRequestConfig) {this.instance = axios.create(config);// 为每个请求都生成一个 signal,并以 url 为 key 添加入 mapthis.instance.interceptors.request.use(config => {// 如果具体方法中设置了 signal,这里就不再添加,避免覆盖。if (config.signal) return config;const controller = new AbortController();config.signal = controller.signal;const url = config.url || "";this.abortControllerMap.set(url, controller);return config;},(err: AxiosError) => {throw err;});// 响应完,从map中去除 urlthis.instance.interceptors.response.use(res => {const url = res?.config.url || "";this.abortControllerMap.delete(url);return res;},(err: AxiosError) => {const url = err?.config?.url || "";this.abortControllerMap.delete(url);throw err;});}/*** 取消全部请求*/cancelAllRequest() {for (const [, controller] of this.abortControllerMap) {controller.abort();}this.abortControllerMap.clear();}/*** 取消指定的请求* (并发上传文件的url通常是一样的,通过url取消请求会取消所有上传操作,故此方法不宜用来取消上传请求)* @param url 待取消的请求URL*/cancelRequest(url: string | string[]) {const urlList = Array.isArray(url) ? url : [url];urlList.forEach(_url => {this.abortControllerMap.get(_url)?.abort();this.abortControllerMap.delete(_url);});}
}
http://www.fp688.cn/news/159305.html

相关文章:

  • 网站推广的10种方法网页广告怎么投放
  • 医院网站规划方案下载百度到桌面上
  • 重庆建设网站seo关键词优化提高网站排名
  • 新手自建网站做跨境电商百度百科推广联系方式
  • 建设b2b网站要求比较好的搜索引擎
  • 小米路由2 做网站长沙网络营销公司排名
  • 慈溪做网站公司哪家好张家界百度seo
  • 网站手机端的优势企业网站推广方案
  • 日本做设计的网站有哪些内容小学生简短小新闻十条
  • 绥化网站建设公司seoyoon
  • 广州天河建网站的公司网站seo软件
  • 公墓网站建设模板网站建站哪家好
  • 上海比较好的设计工作室手机优化什么意思
  • 平面设计工作好找吗广告开户南京seo
  • 会做网站开发 但是不会二次开发西安网站关键词排名
  • iis做动态网站吗百度首页登录入口
  • 河北省市场监督管理局seo类目链接优化
  • 可以自学做网站吗手机百度网页版 入口
  • 苏州做网站的网络公司诈骗网络渠道有哪些
  • 网站建设拓客有什么方法个人推广平台
  • 网站打开速度慢的原因中国十大策划公司排名
  • 厦门建网站做优化小璇seo优化网站
  • 淘宝客网站主题模版seo查询
  • 哪些网站做商标注册百度手机助手app免费下载
  • 品牌设计工作室简述seo
  • 烟台百度网站建设全球搜索引擎排名2022
  • 常州seo南京 seo 价格
  • 蒙牛网站是谁做的线下推广渠道有哪些方式
  • 做网站亏本关键字是什么意思
  • 网站显示后台登陆链接优化资源配置