1*d704daedS猫头猫import {nanoid} from 'nanoid'; 2*d704daedS猫头猫 3*d704daedS猫头猫const locks = new Map<string, string>(); 4*d704daedS猫头猫 5*d704daedS猫头猫export interface ILock { 6*d704daedS猫头猫 key: string; 7*d704daedS猫头猫 lockId: string; 8*d704daedS猫头猫 valid: () => boolean; 9*d704daedS猫头猫 release: () => void; 10*d704daedS猫头猫} 11*d704daedS猫头猫 12*d704daedS猫头猫function requireLock(key: string): ILock { 13*d704daedS猫头猫 const lockId = nanoid(); 14*d704daedS猫头猫 locks.set(key, lockId); 15*d704daedS猫头猫 16*d704daedS猫头猫 return { 17*d704daedS猫头猫 key, 18*d704daedS猫头猫 lockId, 19*d704daedS猫头猫 /** 锁是否有效 */ 20*d704daedS猫头猫 valid() { 21*d704daedS猫头猫 const currentLockId = locks.get(key); 22*d704daedS猫头猫 return !currentLockId || currentLockId === lockId; 23*d704daedS猫头猫 }, 24*d704daedS猫头猫 /** 释放后赋空 */ 25*d704daedS猫头猫 release() { 26*d704daedS猫头猫 const currentLockId = locks.get(key); 27*d704daedS猫头猫 if (currentLockId === lockId) { 28*d704daedS猫头猫 locks.delete(key); 29*d704daedS猫头猫 } 30*d704daedS猫头猫 }, 31*d704daedS猫头猫 }; 32*d704daedS猫头猫} 33*d704daedS猫头猫 34*d704daedS猫头猫export {requireLock}; 35