批量推送
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import { ref } from 'vue'
|
||||
|
||||
/**
|
||||
* 异步操作防重入锁 (UI 层面的"防抖")
|
||||
*
|
||||
* 适用场景: 接口响应慢, 用户在等待期间可重复点击同一按钮, 导致并发请求.
|
||||
* - 第一次调用 run(): locked 置 true, 执行 fn, 完成后 (无论成败) 解锁
|
||||
* - 锁定期间的调用: 立即 return, 不发起任何请求
|
||||
*
|
||||
* 用法:
|
||||
* const { locked, run } = useAsyncLock()
|
||||
*
|
||||
* async function sendSms() {
|
||||
* if (!valid) return
|
||||
* await run(async () => {
|
||||
* const r = await request(...)
|
||||
* // ... 业务处理 ...
|
||||
* })
|
||||
* }
|
||||
*
|
||||
* 模板绑定:
|
||||
* <el-button :loading="locked" :disabled="locked || ..." @click="sendSms">发送验证码</el-button>
|
||||
*
|
||||
* 注意: 这是"按钮重入锁", 不是传统 lodash.debounce (后者会延迟执行). 这里
|
||||
* 第一次点击立即发出, 但锁定期间所有点击被丢弃 — 这才是"防重复请求"的正确语义.
|
||||
*/
|
||||
export function useAsyncLock() {
|
||||
const locked = ref(false)
|
||||
|
||||
async function run(fn) {
|
||||
if (locked.value) return undefined
|
||||
locked.value = true
|
||||
try {
|
||||
return await fn()
|
||||
} finally {
|
||||
locked.value = false
|
||||
}
|
||||
}
|
||||
|
||||
return { locked, run }
|
||||
}
|
||||
Reference in New Issue
Block a user