<!-- 添加锁机制 商品购买添加锁 -->
let JlockCache = new Map();
export async function Jsclock(key){
var clock = JlockCache.get(key);
var awaitObj;
if(clock) {
awaitObj = clock[clock.length-1];
}else{
clock = [];
JlockCache.set(key,clock)
}
var success;
var res =new Promise(re=>success=re);
clock.push(res);
if(awaitObj) await awaitObj;
return ()=>{
var eq = clock.shift();
if(eq!=res) throw new Error('unkown error');
if(!clock.length)JlockCache.delete(key);
success()
}
}
<!-- 案例 -->
<!-- 购买案例 -->
async userAuction(pid, price, ctx) {
new FieldVerify(pid).isRequired("商品ID不能为空");
const lock = await JsLock('auction-' + pid);
try {
const { userId, unionid } = ctx.currentUser();
if (!unionid) {
throw new Error("未登录");
}
const ret = await AuctionService.userAuction(pid, price, unionid);
return ret;
} finally {
lock();
}
}