一比一还原axios源码(三)—— 错误处理

前面的章节我们已经可以正确的处理正确的请求,并且通过处理header、body,以及加入了promise,让我们的代码更像axios了。这一章我们一起来处理ajax请求中的错误。一、错误处理首先我

大家好,又见面了,我是你们的朋友全栈君。

  前面的章节我们已经可以正确的处理正确的请求,并且通过处理header、body,以及加入了promise,让我们的代码更像axios了。这一章我们一起来处理ajax请求中的错误。

一、错误处理

  首先我们要知道错误有哪些类型,通常我们遇到的错误有以下几种:网络错误、超时错误和非200状态码错误。其实都不复杂我们来看下:

1、网络异常

  网络异常,会触发XMLHttpRequest的onerror事件,所以我们只需要加上就可以了:

request.onerror = function handleError() {
  reject(new Error("Network Error"));
};

2、超时错误

  XMLHttpRequest对象允许配置timeout参数,默认是0,也就是永远不会超时,所以我们的代码这样处理就可以了,注意,这里的config.timeout的config,实际上就是我们传入的配置参数,只不过这里引用了一下,包括后续的完整的实现其他api的部分,有很多其实都是对原生api的一个简单的映射和转换,后面再说:

if (config.timeout) {
  request.timeout = config.timeout;
}

request.ontimeout = function handleTimeout() {
  reject(new Error(`Timeout of ${config.timeout} ms exceeded`));
};

3、非200状态码

  如果请求报错。那么XMLHttpRequest的status属性会返回0,所以我们需要额外判断下status,中断后续的代码:

<span role="heading" aria-level="2">一比一还原axios源码(三)—— 错误处理

   我们在onreadystatechange回调中加入status的判断。然后我们改变一下抛出response的方式,使用一个函数来处理:

return new Promise((resolve, reject) => {
var request = new XMLHttpRequest();
config.headers = processHeaders(config.headers || {}, config.data);
config.data = transformRequest(config.data);
request.open(
  config.method.toUpperCase(),
  buildURL(config.url, config.params, config.paramsSerializer),
  true
);
request.onreadystatechange = function handleLoad() {
  if (request.readyState !== 4) {
    return;
  }
  if (request.status === 0) {
    return;
  }
  const responseHeaders = parseHeaders(request.getAllResponseHeaders());
  const responseData =
    config.responseType && config.responseType !== "text"
      ? request.response
      : request.responseText;
  const response = {
    data: responseData,
    status: request.status,
    statusText: request.statusText,
    headers: responseHeaders,
    config,
    request,
  };
  handleResponse(response);
};
// 加了这个方法来集中处理response
function handleResponse(response) { if (response.status >= 200 && response.status < 300) { resolve(response); } else { reject(new Error(`Request failed with status code ${response.status}`)); } }

  很简单~~。错误处理完成到这里实际上就完成了,简单总结下,拦截了readystatechange事件中的status并根据对应的情况,处理response是resolve还是reject。然后根据timeout和error事件来抛出对应的错误。

  但是到这里还没真正的完成错误的处理,因为我们在错误处理的时候仅仅抛出了错误信息,没办法处理一些额外的数据,比如请求配置、响应对象等。我们下面来完成一个Error类,集中处理这些情况,让我们的代码更健壮。

二、完成AxiosError

  首先我们在core文件夹下创建一个createError文件:

export default function createError(message, config, code, request, response) {
  var error = new Error(message);
  return enhanceError(error, config, code, request, response);
}

  我们来看上面的代码,整个createError方法,返回了报错信息、配置、状态码、请求和响应内容。然后我们实际执行返回的是enhanceError方法。我们再来在core文件夹下创建一个enhanceError文件:

export default function enhanceError(error, config, code, request, response) {
  error.config = config;
  if (code) {
    error.code = code;
  }

  error.request = request;
  error.response = response;
  error.isAxiosError = true;

  error.toJSON = function toJSON() {
    return {
      // Standard
      message: this.message,
      name: this.name,
      // Microsoft
      description: this.description,
      number: this.number,
      // Mozilla
      fileName: this.fileName,
      lineNumber: this.lineNumber,
      columnNumber: this.columnNumber,
      stack: this.stack,
      // Axios
      config: this.config,
      code: this.code,
      status:
        this.response && this.response.status ? this.response.status : null,
    };
  };
  return error;
}

  上面的代码,很简单,把所有的信息绑定到error对象上,最后再返回error即可。其中需要注意的是,error.toJSON这个东西,它实际上做的就是当你在外层调用error的toJSON方法的时候,会返回这个更改后的方法。相当于改写了这个对象上的toJSON方法。

  比如我们打印下这个东西:

console.log(
  createError(timeoutErrorMessage, config, "ETIMEDOUT", request).toJSON()
);

<span role="heading" aria-level="2">一比一还原axios源码(三)—— 错误处理

  就是enhanceError返回的那个。OK,到此我们已经写好了createError方法(其实我是从源码复制过来的,一点修改都没有)。那么我们需要修改下之前错误处理中的代码,至于具体修改的方法,就当留个作业了。大家也可以去项目中的c3分支查看。

  到此,我们处理完了错误信息,添加了新的createError方法。到目前为止,其实代码都还不是真正的axios,为什么这么说呢,到现在,我们只是实现了其中的功能,但是其实还不是真正的axios源码的组织方式,我们下一章,就来扩展整个zaking-axios,修改文件的相关性,创建Axios类等,来完成更多的功能。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124370.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UCI数据集整理(附论文常用数据集)

    UCI数据集整理(附论文常用数据集)摘要:UCI数据集作为标准测试数据集经常出现在许多机器学习的论文中,为了更方便使用这些数据集有必要对其进行整理,这里整理了论文中经常出现的数据集,并详细介绍如何使用MATLAB将数据集文件整理成自己需要的格式以及如何使用数据集文件。要点如下UCI数据集介绍用程序整理数据集如何使用数据集文件点击跳转至UCI数据集下载页1.前言UCI数据集是一个常用的机器…

    2022年6月28日
    42
  • nginx性能优化面试题_nginx高并发优化

    nginx性能优化面试题_nginx高并发优化nginx的优化1.gzip压缩优化2.expires缓存有还3.网络IO事件模型优化4.隐藏软件名称和版本号5.防盗链优化6.禁止恶意域名解析7.禁止通过IP地址访问网站8.HTTP请求方法优化9.防DOS攻击单IP并发连接的控制,与连接速率控制10.严格设置web站点目录的权限11….

    2022年8月27日
    3
  • jenkins踩坑——插件冲突「建议收藏」

    jenkins踩坑——插件冲突「建议收藏」当前jenkins版本:2.286冲突插件:FoldersPlugin和ExtendedChoiceParameterPlug-In问题现象通过FoldersPlugin创建目录层次的工程某一个工程创建之后无法读取文件中的内容,而这个工程是从同一目录的其他工程(可以读取文件内容)复制而来。仅项目名称和svn路径不同问题分析增加插件com.cwctravel.hudson.plugins.extended_choice_parameter.ExtendedChoiceParam

    2022年5月7日
    87
  • 卡盟平台_卡盟做淘宝对接好吗

    卡盟平台_卡盟做淘宝对接好吗简介:商城风格,三内页模板,全修复无BUG,一键装修主站,一键对接货源,自定义后台登录背景,前台风格自定义背景等,已集成易接口对接易充值接口,修复BUG等上传好后解压文件修改0.system.conf文件输入自己绑定的域名创建一个数据库systemroot密码改为root这里演示默认,运营的时候自行修改密码导入数据库打开apache的配置把最后一行修改为IncludeOptional/home/vhost/*.conf在计划任务里面添加Shell脚本任务名称随便设置执行周期为1

    2022年8月12日
    2
  • 微信公众号推广_微信公众号评论点赞

    微信公众号推广_微信公众号评论点赞原标题:微信公众号分享集赞吸粉方案,人人可复制分享集赞这种方式很早就有了,不仅在微信公众号运营圈子里面盛行,很多做微商、代购的都很喜欢用这种方式吸粉,其优点是操作简单,可行性佳,获粉成本低。小编在自己博客分享了一些吸粉的文章,但很多同学反馈大多数方法操作难度大,需要很大的工作量,其中80%的朋友还觉得不擅长去做这些事情,需要对这些领域有一定的认识,并且不知道这些事情做了之后有没有效果,其实有这种担…

    2022年9月6日
    5
  • sop流程图模板_这是一份标准作业流程SOP详解,附流程图绘制规范,不愁不会画!…「建议收藏」

    sop流程图模板_这是一份标准作业流程SOP详解,附流程图绘制规范,不愁不会画!…「建议收藏」注:资料来源百度、档即用网,品质人生质量开讲平台搜集、整理、编辑,仅供学习交流所用,请勿做其他用途!小编辛苦整理,转载请注明出处。什么是SOP?StandardOperationProcedure所谓SOP,是StandardOperationProcedure三个单词中首字母的大写,即标准作业程序。是以文件的形式描述作业员在生产作业过程中的操作步骤和应遵守的事项;是作业员的作业指导书…

    2022年5月26日
    170

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号