知识库

记录点点滴滴

axios使用心得

这两天,项目中用到axios,踩到了各种坑,也体验到了新的代码逻辑思路

axios与ajax

axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。

简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装。

浏览器端发起XMLHttpRequests请求、node端发起http请求、支持Promise AP、客户端支持抵御XSRF

在vue2.0中,官方推荐是采用axios方案

axios文档

中文文档:http://www.axios-js.com/zh-cn/docs/

原文档:https://www.npmjs.com/package/axios

axios封装方案

axios总封装

配置项替换函数,可以实现src替换tar

POST封装(可以通过config替换或新增内容)

GET封装(可以通过config替换或新增内容)

最后注册到全局

axios按顺序调用思路

在ajax使用中,如果对于一个函数需要返回值(如上所示),我们可以在ajax中设置async:false,从而达到同步访问的效果,ajax同步执行后,便可以成功返回值

但是axios为异步请求方案,不支持类似于ajax这样的设置,这个时候如果在GET VALUE中使用axios方法,则执行的顺序为先return后TODO中的axios,故此时返回的值为undefine,最后url code token都得不到理想的顺序执行的值

如果要建立同步的请求顺序,常见有两种方式

其一,采用async/await

看上去问题好像解决了,但实际上getToken变成了异步的函数了!funA函数执行顺序发生了变化,alert中无法正确的显示token值。但由于getData绑定了数据data,因此虽然该函数也是异步执行的,但是当该函数执行完后,可以正确的刷新data数据值,由于用了push方法因此可以局部刷新视图,从而实现数据更新。

其二,.then嵌套

 

 

$get(code).then(保存code).then(post带code的参数,得到token).then(保存token).then(get服务器状态).then(判断状态,如果未启动则post启动,否则return).then(get目录).then(处理目录)

思路技巧

.then中可以嵌套axios方法,如果return出来,就可以理解为替代了这个.then,由于.then为顺序执行,故这两个axios请求为顺序执行,下一个请求可以调用上一个请求的值

.then也可以return空,表示无返回,跳过这个.then,常用在判断中

中间产生的数据可以保存在data中,这样可以用this.data轻松访问

参考资料:https://stackoverflow.com/questions/46347778/how-to-make-axios-synchronous

Promise使用

Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象

一个 Promise有以下几种状态:

  • pending: 初始状态,既不是成功,也不是失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

pending 状态的 Promise 对象可能会变为fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态(rejected)并传递失败信息。当其中任一种情况出现时,Promise 对象的 then 方法绑定的处理方法(handlers )就会被调用(then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争)。

创建方法:

其中resolve可以理解为用于保存正确返回时的响应,在.then(result=>{})中,可以用result获取到

reject可以理解为异常的响应,可以用.catch(error=>{}),error获取到

如果要改变返回的形式,可以使用resolve函数和reject函数分别修改正确返回和异常返回的值

而下面的方法可以使得请求被拦截,直接在console中被拦截

Promise还可以做更多的事情,比如,有若干个异步任务,需要先做任务1,如果成功后再做任务2,任何任务失败则不再继续并执行错误处理函数。

要串行执行这样的异步任务,不用Promise需要写一层一层的嵌套代码。有了Promise,我们只需要简单地写:

其中,job1job2job3都是Promise对象。

除了串行执行若干异步任务外,Promise还可以并行执行异步任务。

试想一个页面聊天系统,我们需要从两个不同的URL分别获得用户的个人信息和好友列表,这两个任务是可以并行执行的,用Promise.all()实现如下:

有些时候,多个异步任务是为了容错。比如,同时向两个URL读取用户的个人信息,只需要获得先返回的结果即可。这种情况下,用Promise.race()实现:

由于p1执行较快,Promise的then()将获得结果'P1'p2仍在继续执行,但执行结果将被丢弃。

如果我们组合使用Promise,就可以把很多异步任务以并行和串行的方式组合起来执行。

参考资料1:https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

参考资料2:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

 

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注