这个异步问题你肯定遇到过,但是会解决的并不多

开发 前端
大家肯定遇到过这样类似的场景:多个 Tab 页点击切换功能,如果用户点击频繁,很可能会出现当前页面显示别的页面的数据。

大家肯定遇到过这样类似的场景:多个 Tab 页点击切换功能,如果用户点击频繁,很可能会出现当前页面显示别的页面的数据。

因为每个接口返回信息的时间是不同的,你不能保证先请求的一定最先返回数据,那么就很可能会出现停留在页面一却出现别的页面的数据的情况。这种异步的情况术语称之为异步竞态。

这时肯定有读者会说了,这还不简单,我能给你轻松想出好几个解决办法。

节流、防抖、加 Loading!

[[382204]]

这些做法固然能解决问题,但是都治标不治本,而且还影响了用户体验,其实还有种办法能够完美解决问题:取消请求。

当然了这个取消请求它只是不继续处理接口后续的响应了,并不是真的把请求给取消了。毕竟请求如果已经发出去的话,我们也不能顺着网线把它追回来。

我们这边以 axios 为例来看看怎么取消请求:

  1. const CancelToken = axios.CancelToken; 
  2. const source = CancelToken.source(); 
  3.  
  4. axios.get('/user/12345', { 
  5.   cancelToken: source.token 
  6. }).catch(function (thrown) { 
  7.   if (axios.isCancel(thrown)) { 
  8.     console.log('Request canceled', thrown.message); 
  9.   } else { 
  10.     // handle error 
  11.   } 
  12. }); 
  13.  
  14. axios.post('/user/12345', { 
  15.   name: 'new name' 
  16. }, { 
  17.   cancelToken: source.token 
  18. }) 
  19.  
  20. // cancel the request (the message parameter is optional) 
  21. source.cancel('Operation canceled by the user.'); 

用法还是挺简单的,对于可能会出现异步竞态的情况下大家可以采用这个方法来解决。简单好用,还不会影响用户体验,封装下代码就能用起来了。

 

责任编辑:赵宁宁 来源: 前端真好玩
相关推荐

2019-10-28 14:07:29

研发管理技术

2011-04-26 09:22:05

SQLite

2020-11-08 14:38:35

JavaScript代码开发

2009-07-23 15:07:32

2021-05-27 09:27:35

开发技能缓存

2021-08-29 18:36:17

MySQL技术面试题

2024-03-18 08:14:07

SpringDAOAppConfig

2022-10-20 18:00:59

OCP模型参数

2020-10-12 09:49:14

C++ 开发代码

2023-03-13 07:41:34

分页查询数据排序

2018-04-25 10:57:00

AIX报错vios

2017-07-14 09:29:45

AndroidWebview

2022-04-01 14:22:52

网络攻击勒索软件IT领导者

2021-04-04 22:31:26

白帽子厂商漏洞

2019-12-05 08:44:20

MybatisSQL场景

2020-04-26 14:40:19

戴尔

2020-09-24 10:49:09

iOSiPadOSBug

2018-03-26 09:39:06

大数据IT互联网

2018-05-21 08:40:58

华为资深工程师程序员

2015-11-19 15:26:32

点赞
收藏

51CTO技术栈公众号