淘汰ajax,jquery ajax,选择axios
axios名称的由来? 个人理解
axios: ajax i/o system
使用方法和promist.all一样。
在axios.all([])放入并发请求的axios,都请求成功后在then中回调
axios.all([])返回的是一个数组,axios还提供了axios.spread,
它可以将数组展开使用,res1,res2,,
//这个httpbin.org网站可以做很多网络请求模拟,没有接口可以尝试用这个 axios.all([ axios({ url:'接口1', }), axios({ url:'接口2', params:{ type:'pop', page:1 } }) ]).then(axios.spread((res1,res2) => { console.log(res1); console.log(res2); }))
如果想两个接口内容相同,我们只需获取一个接口的话,请参考axios封装第二步,封装两个接口,
在catch中使用接口2并传入参数即可。
把一些固定的参数抽取出来进行全局配置
axios.defaults.timeout = 1000axios.defaults.baseURL = '基础接口';//后面设置url的时候只需写路径即可,如/home/data
在开发中有可能我们用的不是一个接口,这个时候使用全局配置就无法获取多个接口了
我们可以创建一个axios实例,一个实例对应一个接口和相应配置,提高开发效率。
在网络开发中,我们使用第三方插件有可能出现第三方插件重大bug或不再维护的情况
当出问题时多个页面修改第三方插件是一件很麻烦的事,所以我们可以封装一个文件作为代理
其他页面从代理中传入config并获取请求,当第三方插件失效只需修改代理文件即可,无需全部修改
import axios from 'axios' export function request(config) { return new Promise((resolve, reject) => { const instance = axios.create({ baseURL:'http://123.207.32.32:8000/api/hy', timeout:5000 }) instance( config ).then( res => { resolve(res) }).catch(err =>{ reject(err) }) }) }
在axios实例中已经内置了promise,所以我们才能回调then/catch,
为什么我们还要再使用promise再回调一次呢,我们的目的是返回结果,
直接把axios实例返回出去不就好了嘛
import axios from 'axios'export function request(config) { const instance = axios.create({ baseURL:'http://123.207.32.32:8000/api/hy', timeout:5000 }) return instance(config)}
啰嗦一句。这里不是export default导出。导入的话记得加import{} 花括号
全局拦截:
拦截器前面使用axios
局部拦截:
拦截器前面使用的是实例的名称
拦截四种方式:
request失败拦截
instance.interceptors.request.use(config =>{ console.log(config); return config },error => { console.log(error); })
response失败拦截
instance.interceptors.response.use(result =>{ console.log(result); return result.data },error => { console.log(error); })
拦截器需求列举
注意事项: