完成50%
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
// 放弃表单确认的唯一生命周期所有者。页面只负责把 visible 同步到自己的 ref;
|
||||
// 重复返回复用同一 Promise,确认、取消或卸载都会先清空内部状态再释放等待者。
|
||||
export const createDiscardConfirmation = (setVisible) => {
|
||||
if (typeof setVisible !== "function") {
|
||||
throw new TypeError("createDiscardConfirmation 的 setVisible 必须是函数");
|
||||
}
|
||||
|
||||
let pendingPromise = null;
|
||||
let resolvePending = null;
|
||||
|
||||
const settle = (confirmed) => {
|
||||
const resolve = resolvePending;
|
||||
resolvePending = null;
|
||||
pendingPromise = null;
|
||||
setVisible(false);
|
||||
resolve?.(confirmed === true);
|
||||
};
|
||||
|
||||
const request = () => {
|
||||
if (pendingPromise) return pendingPromise;
|
||||
setVisible(true);
|
||||
pendingPromise = new Promise((resolve) => {
|
||||
resolvePending = resolve;
|
||||
});
|
||||
return pendingPromise;
|
||||
};
|
||||
|
||||
return Object.freeze({
|
||||
request,
|
||||
confirm: () => settle(true),
|
||||
cancel: () => settle(false),
|
||||
dispose: () => settle(false),
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user