当前位置:   article > 正文

全局 loading

全局 loading

好久不见!

做项目中一直想用一个统一的 loading 状态控制全部的接口加载,但是一直不知道怎么处理,最近脑子突然灵光了一下想到了一个办法。

首先设置一个全局的 loading 状态,优先想到的就是 Pinia

然后因为页面会有很多接口会同时触发接口调用,但是接口响应时间是不一定的,所以采用计数法处理,代码如下

  1. import { defineStore, acceptHMRUpdate } from "pinia";
  2. export const useLoadingStore = defineStore({
  3. id: "loading",
  4. state: () => ({
  5. count: 0
  6. }),
  7. getters: {
  8. /**
  9. * 控制 loading 状态
  10. * 因为接口都是异步调用,所以想了一个办法,利用 Count 计数来控制 loading
  11. * 取消请求 -1
  12. * 添加请求 +1
  13. * 请求报错 -1
  14. * 请求成功 -1
  15. * 请求失败 -1
  16. * 基本可以保证最后一定是 0
  17. * @returns {boolean}
  18. */
  19. loading() {
  20. return this.count > 0;
  21. }
  22. },
  23. actions: {
  24. openLoading() {
  25. this.count + 1
  26. },
  27. closeLoading() {
  28. this.count - 1
  29. }
  30. }
  31. });
  32. // 确保传递正确的 store 声明,本例中为 `useLoadingStore`
  33. if (import.meta.hot) {
  34. import.meta.hot.accept(acceptHMRUpdate(useLoadingStore, import.meta.hot));
  35. }

估计大佬也看出来了,虽然是个方法,但是很不严谨。因为简单的计数法,会有出现负数的情况,甚至两个接口同时响应的情况(当然这种很极端)

我询问了后端大佬,给我提供了一种互斥锁的概念可以融入其中,所以出现了现在的最好版本

先设计一个互斥锁

  1. let lock = false;
  2. /**
  3. * 互斥锁 处理非常理超级极端的情况(忽略不计,顺便学习而已)
  4. * 开始锁
  5. * @returns {promise}
  6. */
  7. export const acquireLock = () => {
  8. return new Promise(resolve => {
  9. if (!lock) {
  10. lock = true;
  11. resolve();
  12. } else {
  13. setTimeout(resolve, 0);
  14. }
  15. });
  16. };
  17. /**
  18. * 释放锁
  19. */
  20. export const releaseLock = () => {
  21. lock = false;
  22. };

然后引入锁,并且计算的时候,引入 Math.max 方法

  1. import { defineStore, acceptHMRUpdate } from "pinia";
  2. import { acquireLock, releaseLock } from "@/utils/lock.js";
  3. export const useLoadingStore = defineStore({
  4. id: "loading",
  5. state: () => ({
  6. // loading: false
  7. count: 0
  8. }),
  9. getters: {
  10. /**
  11. * 控制 loading 状态
  12. * 因为接口都是异步调用,所以想了一个办法,利用 Count 计数来控制 loading
  13. * 取消请求 -1
  14. * 添加请求 +1
  15. * 请求报错 -1
  16. * 请求成功 -1
  17. * 请求失败 -1
  18. * 基本可以保证最后一定是 0
  19. * @returns {boolean}
  20. */
  21. loading() {
  22. return this.count > 0;
  23. }
  24. },
  25. actions: {
  26. async openLoading() {
  27. // this.loading = true;
  28. await acquireLock();
  29. try {
  30. this.count = Math.max(1, this.count + 1); // 确保count不会变成负数
  31. } finally {
  32. releaseLock();
  33. }
  34. },
  35. async closeLoading() {
  36. // this.loading = false;
  37. await acquireLock();
  38. try {
  39. this.count = Math.max(0, this.count - 1); // 确保count不会变成负数
  40. } finally {
  41. releaseLock();
  42. }
  43. }
  44. }
  45. });
  46. // 确保传递正确的 store 声明,本例中为 `useLoadingStore`
  47. if (import.meta.hot) {
  48. import.meta.hot.accept(acceptHMRUpdate(useLoadingStore, import.meta.hot));
  49. }

这样就可以

看下效果


count 为几就说明有几个接口还未响应

今天就这样,又是小白学习的一天,加油!

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

闽ICP备14008679号