异步请求axios的使用

基于前面一篇文章里对Promise对象的理解,本文主要对异步请求axios进行一个理解学习。

1.低版本浏览器不支持Promise对象的finally方法的问题解决

安装promise.prototype.finally包,并进行引用require('promise.prototype.finally').shim()

参考原文链接:https://blog.csdn.net/u014291497/article/details/80788377

2.axios的全局设置

3.axios Interceptors 拦截器

应用场景:如,常用于在发送请求前显示一下loading...加载中遮罩层之类的,并且在返回数据之后进行关闭,通过拦截器进行统一处理更便捷

4.注意区分axios请求方法为get和post时需要传递的参数key的差异

5.http协议的六种请求方法及区别

get、head、put、delete、post、options,具体区别见参考链接

参考原文链接:https://www.cnblogs.com/wei-hj/p/7859707.html

6.封装及调用方式

//引入安装的包:axios
import axios from 'axios'

// 引入安装的包:promise.prototype.finally
// 用于解决低版本浏览器不支持Promise对象的finally方法,因此需要引入对应的polyfill(如果需要用到的话)
require('promise.prototype.finally').shim()

// Global axios defaults  全局的axios的设置
axios.defaults.timeout = 3000//请求超时的时间设置
axios.defaults.baseURL = 'https://api.example.com'//请求的基路径

// Interceptors 拦截器
// 常用于在发送请求前显示一下loading...加载中遮罩层之类的,并且在返回数据之后进行关闭,通过拦截器进行统一处理更便捷
// Add a request interceptor 添加一个请求时的拦截器
axios.interceptors.request.use(
    config => {
    	// Do something before request is sent
    	// 此处写一些请求发送之前需要做的事
        return config;
    },
    error => {
    	// Do something with request error
        return Promise.reject(error);
    });
    
// Add a response interceptor 添加一个响应后的拦截器
axios.interceptors.response.use(
    response => {
    	// Do something with response data
        return response;
    },
    error => {
    	// Do something with response error
        return Promise.reject(error)
    });

// 对axios请求进行封装,定义了一个函数http,接收两个参数request <= {url: '', method: ''}, data: 其他按需需要传的参数对象
// 返回值是一个Promise的实例,由前面对Promise的学习已经知道,Promise对象代表一个异步操作,resolve函数可以将异步操作的结果作为参数传递出去
// 调用Promise的实例的then方法,then方法的回掉函数的参数里,就是Promise对象传出来的值了
// 所以,调用方法示例如下:
//	http(url.login, params).then((value) => {
//		//Do something with response data: value				
//	})
const http = (request, data) => {
    return new Promise((resolve, reject) => {
    	// 依据请求方法的不同,axios需要传递的key值不同,所以进行一下处理
    	// method为post时,key值用data
    	// method为get时,key值用params(其他几个方法不常用,但是axios文档里有涉及到,记得和post不是一伙就行了,详细参阅其他文档)
    	// 数组.indexOf(数组中的某个值)  =>  查找该值在数组中的索引,不存在为-1
        let method = request.method,
            params = ['get', 'delete', 'head'].indexOf(method) > -1 ? {
                params: data
            } : {
                data: data
            };
        axios({
            ...request,
            ...params
        }).then(response => {
            resolve(response.data);//将异步操作的结果作为参数传递出去, 实例的then方法的回调函数的参数用于接收
        }, err => {
            reject(err)
        })
    })
}
//在此处集中管理所有需要请求的url信息url和method,其他参数各自处理
const url = {
    exportFile: {
        url: '/file/exportFile',
        method: 'post',
        headers: {
            responseType: 'blob'
        },
        timeout: 80000
    },
    searchRoutes: {
        url: '/searchRoutes',
        method: 'post'
    }
    // ...
}
//最后,将定义好的http和url暴露出去
export {
    http,
    url
}

参考文档链接:https://www.npmjs.com/package/axios

7.定义函数http部分ES6语法的理解

posted @ 2019-02-13 17:57  近距离  阅读(10194)  评论(0编辑  收藏  举报