批量推送

This commit is contained in:
郭庆泰
2026-08-16 21:24:53 +08:00
parent 0c093076a4
commit ccfd03a6eb
55 changed files with 3772 additions and 577 deletions
+41
View File
@@ -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 }
}