/** 购买页限购检查的响应式状态;序号隔离连续修改数量引发的乱序返回。 */ import { ref } from "vue"; function t(t) { let n = ref(!1), r = ref(!1), i = ref(!1), a = ref(``), o = 0; // 配置变化时重置并作废在途响应,不能沿用上一份 allowed 状态。 function s() { (o++, (n.value = !1), (r.value = !1), (i.value = !1), (a.value = ``)); } // t 为真实限购请求函数,e 为当前购买信息;只有最后一次请求能更新页面状态。 async function c(e) { let s = ++o; ((n.value = !0), (r.value = !1), (i.value = !1), (a.value = ``)); try { let n = await t(e); if (s !== o) return; // checked 代表检查已结束,不代表允许购买;协议异常时 allowed 继续保持 false。 if ( !n || typeof n != `object` || !(`allowed` in n) || typeof n.allowed != `boolean` || !(`message` in n) || typeof n.message != `string` ) throw Error(`限购检查暂时不可用,请重试`); ((i.value = n.allowed), (a.value = n.allowed ? `` : n.message || `此商品已达到购买限制,请调整数量后重试`)); } catch (e) { s === o && (a.value = (e instanceof Error ? e.message : ``) || `限购检查暂时不可用,请重试`); } finally { s === o && ((n.value = !1), (r.value = !0)); } } return { pending: n, checked: r, allowed: i, message: a, check: c, reset: s, }; } export { t };