当前位置:   article > 正文

如何终止前端发起的请求?_requesttask.abort()

requesttask.abort()

目录

问题描述:

问题案例:

问题解决:

1,【原生JS】XMLHttpRequest.abort();

2,【Ajax】ajax.abort(); 

3,【axios】axios.CancelToken;

4,【微信小程序 】RequestTask.abort();

5,【uni-app】 requestTask.abort();


问题描述:

当前端请求发送并且响应未完成时,终止请求,不再返回数据

问题案例:

1,一些列表页接口比较慢,改变查询条件后发送查询请求,这样就和上次的查询请求形成两个异步请求,有时可能就会发生本次请求先得到响应数据,然后上一次请求后得到响应数据,这样在页面上的查询结果就会出现bug。(不是单纯的防抖和节流就能解决问题)

2,一些大文件上传,需要很久的时间,用户在中途想要终止上传

问题解决:

1,【原生JSXMLHttpRequest.abort();

如果该请求已被发出,XMLHttpRequest.abort() 方法将终止该请求。当一个请求被终止,它的 readyState 属性将被置为0( UNSENT )。示例:

  1. let xhr = new XMLHttpRequest(),
  2. method = "GET",
  3. url = "https://developer.mozilla.org/"; // 仅为示例,并非真实接口地址。
  4. xhr.open(method,url,true);
  5. xhr.send();
  6. xhr.abort(); // 终止请求

2,【Ajax】ajax.abort(); 

示例:

  1. let queryTruckAjax;
  2. if(queryTruckAjax){
  3. queryTruckAjax.abort(); // 终止请求
  4. }
  5. queryTruckAjax = $.ajax({
  6. type: "POST",
  7. url:url,
  8. dataType: "json",
  9. success: function(data) {
  10. do thing...
  11. },error: function () {
  12. }
  13. });

3,【axios】axios.CancelToken;

Axios 提供了一个 CancelToken的函数,这是一个构造函数,该函数的作用就是用来取消接口请求的。利用axios请求的config参数,向axios添加一个包含cancelToken的config配置对象。示例:

可以使用 CancelToken.source 工厂方法创建 cancel token,像这样:

  1. <body>
  2. <div class="page" id="app">
  3. <button @click="getMsgFirst" class="get-msg">获取数据1</button>
  4. <button @click="getMsgSecond" class="get-msg">获取数据2</button>
  5. <button @click="cancelGetMsg" class="cancel">取消获取</button>
  6. </div>
  7. <script>
  8. import axios from 'axios'
  9. var app = new Vue({
  10. el: '#app',
  11. data: {
  12. cancelToken: null, // 这里要先初始化
  13. source: null, // 这里要先初始化
  14. },
  15. created() {
  16. this.cancelToken = axios.CancelToken;
  17. this.source = this.cancelToken?.source();
  18. },
  19. methods: {
  20. getMsgFirst () {
  21. axios.get('/user/12345', {
  22. cancelToken: this.source?.token
  23. }).catch(function(thrown) {
  24. if (axios.isCancel(thrown)) {
  25. console.log('Request canceled', thrown.message);
  26. } else {
  27. // 处理错误
  28. }
  29. });
  30. },
  31. getMsgSecond () {
  32. axios.get('/user/12345', {
  33. cancelToken: this.source?.token
  34. }).catch(function(thrown) {
  35. if (axios.isCancel(thrown)) {
  36. console.log('Request canceled', thrown.message);
  37. } else {
  38. // 处理错误
  39. }
  40. });
  41. },
  42. cancelGetMsg () {
  43. // 取消请求(message 参数是可选的)
  44. this.source.cancel('Operation canceled by the user.');
  45. }
  46. }
  47. })
  48. </script>
  49. </body>

还可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token:

  1. <body>
  2. <div class="page" id="app">
  3. <button @click="getMsg" class="get-msg">获取数据</button>
  4. <button @click="cancelGetMsg" class="cancel">取消获取</button>
  5. <ul>
  6. <li v-for="item in items">{{item.name}}</li>
  7. </ul>
  8. </div>
  9. <script>
  10. import axios from 'axios'
  11. var app = new Vue({
  12. el: '#app',
  13. data: {
  14. message: 'Hello Vue!',
  15. items: [],
  16. cancel: null // 这里要先初始化
  17. },
  18. methods: {
  19. getMsg () {
  20. let CancelToken = axios.CancelToken
  21. let self = this
  22. // 仅为示例,并非真实接口地址。
  23. axios.get('http://jsonplaceholder.typicode.com/comments', {
  24. cancelToken: new CancelToken(c => {
  25. this.cancel = c
  26. console.log(c)
  27. // 这个参数 c 就是CancelToken构造函数里面自带的取消请求的函数,这里把该函数当参数用
  28. })
  29. }).then(res => {
  30. this.items = res.data
  31. }).catch(err => {
  32. console.log(err)
  33. })
  34. },
  35. cancelGetMsg () {
  36. this.cancel() // 终止请求
  37. }
  38. }
  39. })
  40. </script>
  41. </body>

实例化后的 axios 访问不到 CancelToken,但是你可以这样做:

  1. import { Axios } from '@/common'
  2. import axios from 'axios'
  3. export let cancelAnalysisTask = null
  4. // 解析excel
  5. export const analysis = (option = {}) => Axios.post('/get/list', option, {
  6. cancelToken: new axios.CancelToken(c => { // 这里的CancelToken原生的axios上的
  7. cancelAnalysisTask = c
  8. })
  9. })

4,【微信小程序 】RequestTask.abort();

示例:

  1. if (requestTask) {
  2. requestTask.abort(); // 终止请求
  3. }
  4. let requestTask = wx.request({
  5. url: 'test.php', //仅为示例,并非真实的接口地址
  6. data: {
  7. x: '',
  8. y: ''
  9. },
  10. header: {
  11. 'content-type': 'application/json' // 默认值
  12. },
  13. success (res) {
  14. console.log(res.data)
  15. }
  16. })

5,【uni-app】 requestTask.abort();

如果希望返回一个 requestTask 对象,需要至少传入 success / fail / complete 参数中的一个,如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象。示例:

  1. const requestTask = uni.request({
  2. url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
  3. data: {
  4. name: 'name',
  5. age: 18
  6. },
  7. success: function(res) {
  8. console.log(res.data);
  9. }
  10. });
  11. // 终止请求
  12. requestTask.abort();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/66665
推荐阅读
相关标签
  

闽ICP备14008679号