全局 loading

news/2024/9/1 3:06:12 标签: javascript, 前端, 开发语言

好久不见!

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

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

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

javascript">import { defineStore, acceptHMRUpdate } from "pinia";

export const useLoadingStore = defineStore({
  id: "loading",

  state: () => ({
    count: 0
  }),

  getters: {
    /**
     * 控制 loading 状态
     * 因为接口都是异步调用,所以想了一个办法,利用 Count 计数来控制 loading
     * 取消请求 -1
     * 添加请求 +1
     * 请求报错 -1
     * 请求成功 -1
     * 请求失败 -1
     * 基本可以保证最后一定是 0
     * @returns {boolean}
     */
    loading() {
      return this.count > 0;
    }
  },
  actions: {
    openLoading() {
      this.count + 1
    },
    closeLoading() {
      this.count - 1
    }
  }
});

// 确保传递正确的 store 声明,本例中为 `useLoadingStore`
if (import.meta.hot) {
  import.meta.hot.accept(acceptHMRUpdate(useLoadingStore, import.meta.hot));
}

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

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

先设计一个互斥锁

javascript">let lock = false;

/**
 * 互斥锁 处理非常理超级极端的情况(忽略不计,顺便学习而已)
 * 开始锁
 * @returns {promise}
 */
export const acquireLock = () => {
  return new Promise(resolve => {
    if (!lock) {
      lock = true;
      resolve();
    } else {
      setTimeout(resolve, 0);
    }
  });
};

/**
 * 释放锁
 */
export const releaseLock = () => {
  lock = false;
};

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

javascript">import { defineStore, acceptHMRUpdate } from "pinia";
import { acquireLock, releaseLock } from "@/utils/lock.js";

export const useLoadingStore = defineStore({
  id: "loading",

  state: () => ({
    // loading: false
    count: 0
  }),

  getters: {
    /**
     * 控制 loading 状态
     * 因为接口都是异步调用,所以想了一个办法,利用 Count 计数来控制 loading
     * 取消请求 -1
     * 添加请求 +1
     * 请求报错 -1
     * 请求成功 -1
     * 请求失败 -1
     * 基本可以保证最后一定是 0
     * @returns {boolean}
     */
    loading() {
      return this.count > 0;
    }
  },
  actions: {
    async openLoading() {
      // this.loading = true;
      await acquireLock();
      try {
        this.count = Math.max(1, this.count + 1); // 确保count不会变成负数
      } finally {
        releaseLock();
      }
    },
    async closeLoading() {
      // this.loading = false;
      await acquireLock();
      try {
        this.count = Math.max(0, this.count - 1); // 确保count不会变成负数
      } finally {
        releaseLock();
      }
    }
  }
});

// 确保传递正确的 store 声明,本例中为 `useLoadingStore`
if (import.meta.hot) {
  import.meta.hot.accept(acceptHMRUpdate(useLoadingStore, import.meta.hot));
}

这样就可以

看下效果


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

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


http://www.niftyadmin.cn/n/5561688.html

相关文章

21天学通C++:第十三、十四章节

第十三章:类型转换运算符 类型转换是一种机制,让程序员能够暂时或永久性改变编译器对对象的解释。注意,这并不意味着程序员改变了对象本身,而只是改变了对对象的解释。可改变对象解释方式的运算符称为类型转换运算符。 为何需要…

Spring Boot请求参数映射:@RequestBody、@RequestParam和@RequestPart的应用

文章目录 引言I @RequestBody(接收请求体中的数据)1.1 简介1.2 签名II @RequestParam(接收任意类型的参数)3.1 接收文件类型参数和普通查询参数3.1 只接收文件参数III @RequestPart(接收文件类型参数)3.1 普通文件上传3.2 上传多个属性名相同的文件3.3 上传一个图片和一个文…

少儿编程启蒙宝典:Scratch动画游戏108变

一、编程教育的时代价值与意义 随着数字时代的深入发展,社会对人才的需求正发生深刻变革,计算思维与编程能力已成为衡量个人竞争力的重要指标。在此背景下,培养孩子们运用计算思维解决实际问题的能力,成为教育领域的重要任务。编…

[激光原理与应用-115]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 19 - 主要硬件的介绍、安装与调试

目录 一、概述 1.1 前言 1.2 系统组成 1.2.1 机柜版: 1.2.2 非机柜版 1.3适用范围 1.4 工作条件 1.5 安全说明 1.6 装箱清单 二、硬件安装 2.1 光学传感器安装 2.1.1 转接件安装 2.1.2 光路校准模块的安装与光路校准 2.1.3 光学传感器的安装 2.2 通…

从手工测试转型自动化测试,待遇翻倍,熬夜7天整理这一份超全学习指南【附网盘资源】

因为我经常在分享自动化测试技术,最近被问到: 功能测试想转自动化,请问应该怎么入手?有没有好的资源推荐? 那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。学习路线和网盘资源放在文…

UOS查看系统信息命令行

UOS查看系统信息命令行 *** Rz整理 仅供参考 *** dmidecode查看System Boot信息 midecode -t 32 dmidecode查看System Reset信息 midecode -t 23 dmidecode查看机箱信息 midecode -t chassis dmidecode查看BIOS信息 midecode -t bios dmidecode查看CPU信息 dmidecode …

C++ 几何计算库

代码 #include <iostream> #include <list> #include <CGAL/Simple_cartesian.h> #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_segment_primitive.h> #include <CGAL/Polygon_2.h>typedef CGAL…

青远生态受邀参加2024年生物多样性学术会议并介绍北极花、规划助手等软件产品

01 会议简介 7月14-15日&#xff0c;由中国环境科学研究院等单位共同主办的2024年生物多样性学术会议在河北雄安召开。青远生态参会并分享《北极花 APP&#xff1a;数智赋能生物多样性监测与保护》《自然保护地总体规划智能编制》等多个专题报告。 会议现场&#xff0c;北极花…