您现在的位置是:群英 > 开发技术 > web开发
详解axios异步请求的流程与原理是什么?
Admin发表于 2022-08-27 17:10:59794 次浏览
这篇文章主要介绍了title,小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望大家通过这篇文章可以有所收获。

一、什么是axios?

axios是一个基于Promise的方法,可以发送get、post等请求,并且前后端都可以使用。【推荐:Ajax视频教程,web前端】

二、axios的内部原理

  • axios库对外暴露了一个axios实例,axios实例其中挂载了一个Axios方法,Axios方法有一个interceptors对象(拦截器),interceptors对象request对象response对象,并且request对象response对象都有use方法,所以,我们可以调用axios.interceptors.request.use()和axios.interceptors.response.use().

  • interceptors对象里面的request对象response对象其实是一个用来管理拦截器的数组(handlers)。当我们调用axios.interceptors.request.use(),就会在request的拦截器数组(handlers)里面push一个成功回调和一个失败回调。每使用一次,就push一次,类似[res1,rej1,res2, rej2…]

  • 接下来是一个chain,它是一个存储所有回调的数组,因为它是给Promise使用的,所以它需要使用两个值,初始值为dispatchRequest和undefiend。接着,Promise.resolve(config).then(fn1, fn2)。当config里面的结果为fulfilled(成功),就把config里的配置传给fn1并执行。如果为reject(报错),就把错误结果传给fn2并执行.即Promise.resolve(config).then(chain[0], chain[1])。chain[0]为成功回调,chain[1]为失败回调。config里面有很多配置项,他们可能是一个string值或方法等。

  • 接下来是整理所有的Promise,把request数组里的回调函数unshift到chain数组的最前面,把response数组里的回调函数push到chain数组的最后面。最终chain数组里面类似[res2, rej2,res1, rej1, dispatchRequest,undefiend,res3, rej3, res4, rej4]。

  • dispatchRequest是用来执行axios.request的,dispatchRequest方法里面有一个adapter,它会根据不同的环境调用不同的对象。如果是在浏览器环境下,调用XMLHttpRequest对象。如果是nodejs环境下,就调用http对象。这就是为什么它既能在前端使用,也能在后端使用的原因。adapter会对请求到的数据进行解析封装,封装后的对象就是我们能看到的response响应对象

  • 处理完dispatchRequest,就会执行interceptors.response的回调函数。这就是为什么我们看到的执行顺序是,后者的interceptors.request比前者的interceptors.requets先执行,接着执行axios.request,最后顺序执行interceptors.response.

  • 接下来执行我们的业务逻辑。

三、axios的使用

1、通过使用axios的方法

常用方法:get, post, request

axios.get

axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  })
  .then(function () {
    // always executed
  });

axios.post

axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

axios.request

可以传入很多请求配置

axios.request({
	url: '/user',
	method: 'get', // 默认
	baseURL: '/api',
	//...})

2、通过传入配置方法

axios({
  method: 'get',
  url: 'http://bit.ly/2mTM3nY',
  responseType: 'stream'})
  .then(function (response) {
    response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
  });

四、响应模块

响应模块有以下几个参数

{
	data: {},
	status: 200,
	statusText: 'ok',
	header: {},
	config: {},
	request: {}}

五、配置

1.全局axios的配置

axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

2.实例的配置

const instance = axios.create({
  baseURL: 'https://api.example.com'});
 instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

3.配置的优先级

const instance = axios.create();instance.defaults.timeout = 2500;instance.get('/longRequest', {
  timeout: 5000});

最终timeout设置的时间是5000,所以这里面的优先级,请求里面的配置>实例化配置>axios的默认配置

六、Interceptors 拦截器

可以在请求数据之前或者接收数据之前处理数据

axios.interceptors.request.use(function (config) {
    return config;
  }, function (error) {
    return Promise.reject(error);
  });
  axios.interceptors.response.use(function (response) {
    return response;
  }, function (error) {
    return Promise.reject(error);
  });

七、并发请求处理

// 把axios请求放进函数里function getUserAccount() {
  return axios.get('/user/12345');}
 function getUserPermissions() {
  return axios.get('/user/12345/permissions');}//函数执行放到Promise里面排队,挨个响应。Promise.all([getUserAccount(), getUserPermissions()])
  .then(function (results) {
    const acct = results[0];
    const perm = results[1];
  });



以上就是关于详解axios异步请求的流程与原理是什么?的介绍,本文内容仅供参考,有需要的朋友可以借鉴了解看看,希望对大家学习或工作,想要了解更多欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: axios原理
相关信息推荐
2022-05-11 11:59:51 
摘要:这篇文章主要介绍了php微信授权登录实例讲解,微信授权登录是比较常用的功能,有需要的同学可以研究下
2022-05-18 16:03:11 
摘要:​本文由go语言​教程栏目给大家介绍关于golang rune类型,希望对需要的朋友有所帮助!
2022-06-28 17:16:12 
摘要:Go语言中字符串的字节使用UTF-8编码表示Unicode文本,因此Go语言字符串是变宽字符序列,本文就来为大家介绍一些go语言中字符串的操作。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部