当前位置:首页 > 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 的请求/响应拦截器实现全局请求锁,适用于需要统一管理的场景。

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 项目中可以使用装饰器封装请求方法。

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'))
}

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

vue实现请求加锁

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

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

相关文章

vue实现聊天

vue实现聊天

Vue实现聊天功能 基础项目结构搭建 使用Vue CLI或Vite创建项目,安装必要依赖如socket.io-client或axios(根据通信方式选择)。核心组件通常包括: ChatWindow.…

vue实现sql操作

vue实现sql操作

在Vue中实现SQL操作通常需要结合后端服务或本地数据库技术,因为前端JavaScript无法直接连接SQL数据库。以下是几种常见的实现方式: 通过API与后端交互 Vue前端通过HTTP请求(如a…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPag…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transit…

vue实现骰子

vue实现骰子

Vue 实现骰子功能 创建 Vue 组件 在 Vue 项目中创建一个骰子组件,例如 Dice.vue。该组件包含骰子的外观和逻辑。 <template> <div class=…