Files
console-dev/app/lib/purchase-limit-state.js

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 };