玩转Angular1(5)--$http服务封装为异常处理服务
更新日期:
AngularJS(v1.5.8)已经成为项目们的基本框架,《玩转Angular1》系列用于记录项目中的一些好玩或者比较特别的思路。
本文记录在angular中简单介绍了Promise,以及使用$http服务进行些简单封装、进行错误码处理的过程。
$http
Promise
- 什么是Promise
一个Promise对象代表一个目前还不可用,但是在未来的某个时间点可以被解析的值。它允许你以一种同步的方式编写异步代码。
Promises将嵌套的callback,改造成一系列的.then的连缀调用,去除了层层缩进的糟糕代码风格。
- Promises/A规范
promise表示一个最终值,该值由一个操作完成时返回。
promise有三种状态:未完成(unfulfilled),完成(fulfilled)和失败(failed)。
promise的状态只能由未完成转换成完成,或者未完成转换成失败。
promise的状态转换只发生一次。
angular的$http服务
$http是AngularJS中的一个核心服务,通过浏览器的XMLHttpRequest对象或者JSONP,用于读取远程服务器的数据。
$http服务是基于$q服务上的拓展。
$q服务是基于Promises/A+规范的异步运行服务,可视为angular的Promise服务吧。
$http服务的使用很简单,提供一些描述请求的参数,请求就出去了,然后返回一个扩充了success方法和error方法的promise对象,你可以在这个对象中添加需要的回调函数。
至于$http的具体使用,大家可以参考官方文档。
|
|
回调中传入的response参数里面有:
- data – {string|Object} – 回调数据
- status – {number} – Http状态码
- headers – {function([headerName])}
- config – {Object}
- statusText – {string}
利用返回的数据和Http状态码,我们可以进行一些通用的异常处理。
异常处理服务
位于data中的错误码
有些时候,后台会通过data中某个code参数返回我们的错误码,此时data中的json对象为:
|
|
这时候我们就需要拿到data之后再进行异常处理。
|
|
可以看到,我们在$http服务发送后拿到Promise,然后进行异常处理之后,再提取出data数据返回。
这里需要注意的是,因为我们并没有在promise链中提供失败回调,这里我们也可以通过在链的尾部添加catch来进行错误处理。
位于http状态码中的错误码
还有些时候,后台会直接通过data中返回我们的错误码,此时data中的json对象为:
|
|
这时候我们需要通过http状态码来判断,我们拿到的data,到底是数据呢,还是错误码。
|
|
这里与前面不同的地方是,当失败回调的时候,我们依然需要判断http状态码,然后进行处理。
异常处理函数errCodeHandler
|
|
其中constant
维护一些常用的转换数据,而constant.errCodes
维护一个对象,来进行错误码的转换展示,其格式如下:
|
|
封装易用的qHttp服务
包含异常处理的qHttp服务
|
|
这里我们通过在原有$http服务外简单封装了一层,达到了提供可以自动进行异常处理,且只把data数据返回的Promise。
调用很简单,和$http服务基本一致:
|
|
对method提供简单调用
上面的qHttp服务中,每次调用都需要手动提供method参数,我们也可以添加一些简单的处理:
|
|
此时我们就可以很方便地使用qHttp服务了:
|
|
至于为什么我们使用angular的$http服务呢,虽然我们的后续规划倾向是尽量脱离angular而使用ES6的modules来进行,但是后面我们会说到一个比较好用的服务: angular的mock模拟数据服务。
结束语
这节主要简单介绍了简单封装$http服务、进行错误码处理的过程。当然大家也可以自行发挥,根据具体情况封装易用的服务,像如果通过JSON传输,就可以封装像postJSON/putJSON等方法,代码中也有提供,大家可以去翻翻看HttpServices这个文件。
此处查看项目代码
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢
码生艰难,写文不易,给我家猪囤点猫粮了喵~