一文讲解Vue中路由切换终止异步请求(附代码)

 4741

本篇文章给大家了解Vue中路由切换终止异步请求,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

一文讲解Vue中路由切换终止异步请求(附代码)


问题:

在SPA模式开发当中,比如VUE,当前路由切换的时候如何终止正在发生的异步请求呢。

结果:

假如请求超时并且有设定超时时间。有一堆的异步请求在执行,当用户切换到另一个页面,这些请求还未终止,并且当服务器响应之后,反馈的结果不是当前页面所期待的。最终会误导用户造成一些不必要的结果。也给web造成性能问题。

解决方案:

把执行的请求存入队列,当路由切换的时候终止队列里的异步请求。

首先搞一棵树来存储请求队列

  1. import Vue from "vue";
  2. import Vuex from "vuex";
  3. Vue.use(Vuex);
  4. let store = new Vuex.Store({
  5.   state: {
  6.     requests: [],
  7.   },
  8. });
  9.  
  10. new Vue({
  11.   el: "#app",
  12.   router: router,
  13.   render: (h) => h(App),
  14.   store,
  15. });

利用ajax请求和终止

  1. var xhr = $.ajax({
  2.   type: "POST",
  3.   url: "xxxsx",
  4.   data: "",
  5.   success: function () {
  6.     alert("ok");
  7.   },
  8. });
  9. //xhr.abort()  终止请求
  10. this.$store.state.requests.push(xhr);

利用superagent请求和终止

  1. const request = require('superagent')
  2. var xhr = request('post','/api/xxxx/xxxx')
  3. xhr.send(data)
  4. //xhr.query(data) //get 传参
  5. xhr.end((err,res)=>{
  6.     ...todo...
  7. })
  8. //xhr.abort() 终止请求
  9. this.$store.state.requests.push(xhr)

利用axios请求

  1. import axios from "axios";
  2. var CancelToken = axios.CancelToken;
  3. var source = CancelToken.source();
  4. axios
  5.   .get("/api/xxxxx/xxxxx", {
  6.     cancelToken: source.token,
  7.   })
  8.   .catch(function (thrown) {
  9.     if (axios.isCancel(thrown)) {
  10.       console.log("Request canceled", thrown.message);
  11.     } else {
  12.       // 处理错误
  13.     }
  14.   });
  15.  
  16. // 取消请求(message 参数是可选的)
  17. //source.cancel('Operation canceled by the user.');
  18.  
  19. this.$store.state.requests.push(source);

利用vue-resource请求

  1. import Vue from "vue";
  2. import req from "vue-resource";
  3. Vue.use(req);
  4.  
  5. this.$http
  6.   .get("/someUrl", {
  7.     before(request) {
  8.       this.$store.state.requests.push(request);
  9.       //request.abort(); 终止请求
  10.     },
  11.   })
  12.   .then(
  13.     (response) => {
  14.       // success callback
  15.     },
  16.     (response) => {
  17.       // error callback
  18.     }
  19.   );

利用fetch请求

fetch貌似无法监控读取进度和终端请求,他没有 timeout 机制,没有 progress 提示,但是可以利用 Promise 来实现终止

  1. var _fetch = (function (fetch) {
  2.   return function (url, options) {
  3.     var abort = null;
  4.     var abort_promise = new Promise((resolve, reject) => {
  5.       abort = () => {
  6.         reject("abort.");
  7.         console.info("abort done.");
  8.       };
  9.     });
  10.     var promise = Promise.race([fetch(url, options), abort_promise]);
  11.     promise.abort = abort;
  12.     return promise;
  13.   };
  14. })(fetch);
  15.  
  16. var xhr = _fetch("/api/xxx/xxxx", { methods: "POST", body: data });
  17. xhr.then(
  18.   function (res) {
  19.     console.log("response:", res);
  20.   },
  21.   function (e) {
  22.     console.log("error:", e);
  23.   }
  24. );
  25. xhr.abort(); //终止
  26.  
  27. this.$store.state.requests.push(xhr);

那么知道如何终止请求,然后也存储了请求实例,剩下的只要监听路由就行了

  1. let router = new Router({....})
  2. //每次路由改变之前终止所有的请求实例
  3. router.beforeEach(function (to, from, next) {
  4.     this.$store.state.requests.forEach(xhr=>xhr.abort()) //终止所有的请求实例
  5.     this.$store.state.requests =[] //执行完清空,等待下一次的页面的请求装载
  6.     next()
  7. })

这种只是假设,自然请求完成之后最好,还是手动释放树的请求示例。例如ajax请求完成之后在complite里面splice store里面的实例。


本文网址:https://www.zztuku.com/detail-9097.html
站长图库 - 一文讲解Vue中路由切换终止异步请求(附代码)
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐