使用Promise、axios封装ajax异步请求

た 入场券 2022-04-11 02:40 577阅读 0赞

先上代码(加载动画用的是Element UI组件)

  1. import axios from "axios"
  2. import Vue from 'vue'
  3. import { Loading } from 'element-ui'
  4. const API_Root = ''
  5. const API_Root_DEV = '/api'
  6. axios.defaults.baseURL = (process.env.NODE_ENV === 'production' ? API_Root : API_Root_DEV)
  7. axios.defaults.headers.Accept = 'application/json'
  8. axios.defaults.timeout = 5000
  9. // 添加请求拦截器
  10. let loadinginstace;
  11. axios.interceptors.request.use(function (config) {
  12. loadinginstace = Loading.service({ text: '正在加载中' });
  13. return config
  14. }, function (error) {
  15. loadinginstace.close();
  16. Vue.toast(error, 'error');
  17. return Promise.reject(error)
  18. })
  19. // 添加响应拦截器
  20. axios.interceptors.response.use(function (response) {
  21. loadinginstace.close();
  22. return response
  23. }, function (error) {
  24. loadinginstace.close();
  25. Vue.toast(error, 'error');
  26. return Promise.reject(error)
  27. })
  28. let ajaxs = {
  29. //一般请求
  30. ajaxCommon (url, data = {}, type = 'GET') {
  31. return new Promise(function (resolve, reject) {
  32. let promise;
  33. if (type === 'GET') {
  34. let str = this._paramJoin(data);
  35. url = str ? (url + '?' + str) : url;
  36. promise = axios.get(url);
  37. }
  38. else if (type === 'POST') {
  39. promise = axios.post(url, data);
  40. }
  41. promise.then(res => resolve(res.data)).catch(err => reject(err));
  42. })
  43. },
  44. //文件
  45. ajaxFile (url, data = {}, type = 'POST') {
  46. return new Promise(function (resolve, reject) {
  47. let promise = axios.post(url, data, {
  48. headers: {
  49. 'content-type': 'multipart/form-data'
  50. }
  51. });
  52. promise.then(res => resolve(res.data)).catch(err => reject(err));
  53. })
  54. },
  55. _paramJoin (data) {
  56. let arr = Object.keys(data);
  57. let str = '';
  58. arr.forEach(function (item) {
  59. str += item + '=' + data[item] + '&';
  60. })
  61. if(str !== ''){
  62. str = str.substr(0, str.length-1);
  63. }
  64. return str;
  65. }
  66. }
  67. export default ajaxs

该方法一定要返回promise对象,为什么这么说呢?要牢记promise的出现就是为了解决异步回调的问题,之前为了要请求的结果继续处理事情要一层套一层,也不方便封装,现在只需要把请求的结果“托管”给promise,那我要数据也要从promise那要,所以封装的ajax()要返回promise对象。

发送axios异步请求,返回的也是promise对象,用.then(调用resolve())和.catch(调用reject())分别处理正确和错误的返回值,我们最终想要的是data
下图是axios的请求值
axios返回值response

下面是如何调用ajax()得到data值

  • 使用promise的then

    getAddress ({commit}) {

    1. let address;
    2. ajax('urlxxxx').then(data => address = data) //将获取的data值赋给变量
    3. commit(receive_address, {address})

    }

  • 使用ES7的async

    async getAddress ({commit}) {

    1. let address = await ajax('urlxxxx');
    2. commit(receive_address, {address})

    }

如果不对axios的请求值进行处理,那就不用加最外层的new Promise(),直接返回axios.get()的返回值promise对象
之前写过总结的promise和async

发表评论

表情:
评论列表 (有 0 条评论,577人围观)

还没有评论,来说两句吧...

相关阅读

    相关 异步请求-AJAX

    什么是同步交互 > 首先用户向HTTP服务器提交一个处理请求。接着服务器端接收到请求后,按照预先编写好的程序中的业务逻辑进行处理,比如和数据库服务器进行数据信息交换。最后,服

    相关 ajax--异步请求

    何为异步请求? 当浏览器向服务器发送同步请求时,服务处理同步请求的过程中,浏览器会处于等待的状态,服务器处理完请求把数据响应给浏览器并覆盖浏览器内存中原有的数据,浏览器重