经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTMLCSS » CSS » 查看文章
vue axios 简单封装以及思考
来源:cnblogs  作者:huangenai  时间:2018/10/10 8:48:58  对本文有异议

先安装 axios

  1. npm install axios

axios的详细介绍以及用法 就不多说了请 移步 github ??  https://github.com/axios/axios

 

下面是简单的封装一个 http.js, 在此说明  checkStatus 这个方法呢 是不一定需要的 ,根据个人的项目需求吧,也可以直接返回response,交给后面另行处理也行。

或者根据后端返回的状态,在里面进行处理 也行。

  1. "use strict";
  2. import axios from "axios";
  3. import qs from "qs";
  4. //添加请求拦截器
  5. axios.interceptors.request.use(
  6. config => {
  7. return config;
  8. },
  9. error => {
  10. return Promise.reject(error);
  11. }
  12. );
  13. //添加响应拦截器
  14. axios.interceptors.response.use(
  15. response => {
  16. return response;
  17. },
  18. error => {
  19. return Promise.resolve(error.response);
  20. }
  21. );
  22. axios.defaults.baseURL = "https://www.xxxx/api";
  23. axios.defaults.headers.post["Content-Type"] = "application/json";
  24. axios.defaults.headers.post["X-Requested-With"] = "XMLHttpRequest";
  25. axios.defaults.timeout = 10000;
  26. function checkStatus(response) {
  27. return new Promise((resolve, reject) => {
  28. if (
  29. response &&
  30. (response.status === 200 ||
  31. response.status === 304 ||
  32. response.status === 400)
  33. ) {
  34. resolve(response.data);
  35. } else {
  36. reject({
  37. state: "0",
  38. message: "网络异常"
  39. });
  40. }
  41. });
  42. }
  43. export default {
  44. post(url, params) {
  45. return axios({
  46. method: "post",
  47. url,
  48. data: params
  49. }).then(response => {
  50. return checkStatus(response);
  51. });
  52. },
  53. get(url, params) {
  54. params = qs.stringify(params);
  55. return axios({
  56. method: "get",
  57. url,
  58. params
  59. }).then(response => {
  60. return checkStatus(response);
  61. });
  62. }
  63. };

 

在vue 项目中,main.js这个文件

  1. import http from "./utils/http";
  2. Vue.prototype.$http = http;

使用 helloworld.vue

  1. ...
  2. methods: {
  3. async TestPost() {
  4. try {
  5. const res = await this.$http.post("/message/socketid", {
  6. account: "huangenai"
  7. });
  8. console.log(res);
  9. } catch (error) {
  10. console.log(error);
  11. }
  12. },
  13. async TestGet() {
  14. this.$http
  15. .get("/price")
  16. .then(res => {
  17. console.log(res);
  18. })
  19. .catch(error => {
  20. alert(error);
  21. });
  22. }
  23. }
  24. ....

 

在main.js中将http.js import 进来 并暴露到全局使用,在任何vue 页面中 就不再需要 import http.js了,而直接通过 this.$http.post this.$http.get 来使用,在checkStatus中统一异步返回,顺便可以处理错误的情况。

 

个人思考:

checkStatus方法 返回了一个 Promise

链式结构的话看上面那个get的方法,this.$http.get(...).then(...).catch(...),如果then 里面又来一个 http请求 会一层包住一层。

如果使用了语法糖 async  await  ,虽然 看起来好像是简单了 不用 一层包住一层 层层嵌套,可是你必须要用到 try catch,如果出现异常 则直接到catch,不会再执行下面到方法。如果再实际业务中,就算出现了某一个http请求失败到情况,不影响下面的逻辑要继续跑下去呢,这个就不适用了。链式结构也是 如果catch到异常 也不会执行then 里面到方法了。

所以,是否把返回的Promise,全部都返回的是 resolve,那么 就不会说出现直接到了 catch 里面不执行以下的业务了逻辑了呢。而且如果使用了语法糖 await 代码看起来更加简洁 也不需要 try catch了, 这样的话 reject是不是就不需要用到了呢。

  1. function checkStatus(response) {
  2. return new Promise(resolve => {
  3. if (
  4. response &&
  5. (response.status === 200 ||
  6. response.status === 304 ||
  7. response.status === 400)
  8. ) {
  9. resolve(response.data);
  10. } else {
  11. resolve({
  12. state: "0",
  13. message: "网络异常"
  14. });
  15. }
  16. });
  17. }

个人觉得这两种方案各有优劣,实际应用中还是应该根据个人业务需求 业务情况而定。

 


此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。

如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号