53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
/** 购买页限购检查的响应式状态;序号隔离连续修改数量引发的乱序返回。 */
|
|
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 };
|