当前位置:首页 > VUE

vue实现请求加锁

2026-03-08 09:56:50VUE

Vue 实现请求加锁的方法

在 Vue 中实现请求加锁可以防止重复请求,提升应用性能和用户体验。以下是几种常见的方法:

使用布尔标志位控制请求状态

在组件或 Store 中定义一个布尔变量,标记当前请求状态。发起请求前检查该标志位,请求结束后重置。

data() {
  return {
    isRequesting: false
  }
},
methods: {
  async fetchData() {
    if (this.isRequesting) return

    this.isRequesting = true
    try {
      const res = await api.getData()
      // 处理响应
    } finally {
      this.isRequesting = false
    }
  }
}

使用 axios 拦截器实现全局锁

通过 axios 的请求/响应拦截器实现全局请求锁,适用于需要统一管理的场景。

vue实现请求加锁

let pendingRequests = 0
const MAX_CONCURRENT = 3

axios.interceptors.request.use(config => {
  if (pendingRequests >= MAX_CONCURRENT) {
    return Promise.reject(new Error('Too many requests'))
  }
  pendingRequests++
  return config
})

axios.interceptors.response.use(
  response => {
    pendingRequests--
    return response
  },
  error => {
    pendingRequests--
    return Promise.reject(error)
  }
)

基于 Promise 的请求队列

创建一个请求队列管理系统,确保同一时刻只有一个相同请求在执行。

const requestMap = new Map()

async function lockedRequest(key, fn) {
  if (requestMap.has(key)) {
    return requestMap.get(key)
  }

  const promise = fn()
  requestMap.set(key, promise)

  try {
    return await promise
  } finally {
    requestMap.delete(key)
  }
}

// 使用示例
lockedRequest('user-data', () => api.getUserData())

使用装饰器模式(Vue + TS)

在 TypeScript 项目中可以使用装饰器封装请求方法。

vue实现请求加锁

function lockRequest(target: any, key: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value
  let isLocked = false

  descriptor.value = async function(...args: any[]) {
    if (isLocked) return
    isLocked = true

    try {
      return await originalMethod.apply(this, args)
    } finally {
      isLocked = false
    }
  }
}

// 使用示例
class ApiService {
  @lockRequest
  async fetchData() {
    return axios.get('/api/data')
  }
}

使用第三方库

考虑使用专门处理并发控制的库如 p-limit

import pLimit from 'p-limit'

const limit = pLimit(1) // 同时只允许1个请求

async function safeFetch() {
  return limit(() => fetch('/api'))
}

选择哪种方法取决于具体需求:

  • 组件级控制适合局部场景
  • 拦截器适合全局控制
  • 请求队列适合复杂并发管理
  • 装饰器适合TS项目
  • 第三方库提供现成解决方案

标签: 加锁vue
分享给朋友:

相关文章

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-web…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定,…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: npm i…

vue实现pwa

vue实现pwa

Vue 实现 PWA 的步骤 Vue 结合 PWA(Progressive Web App)可以创建离线可用的 Web 应用。以下是实现方法: 安装 Vue CLI 并创建项目 确保已安装 Vue…

vue filter 实现

vue filter 实现

在 Vue.js 中,过滤器(Filter)是一种用于文本格式化的功能,可以在模板中直接使用。以下是实现过滤器的详细方法: 全局过滤器注册 通过 Vue.filter 方法注册全局过滤器,可在所有组…

vue实现keepalive

vue实现keepalive

Vue 中实现 keep-alive 在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染和销毁。以下是实现 keep-alive 的几种方法: 基本用法…