fix(#2): Promise泄漏 — confirm/prompt 添加10秒安全超时,防止永不resolve

This commit is contained in:
tianhao
2026-06-16 12:40:39 +08:00
parent 9ce1809928
commit 2e361d40e8
+13 -5
View File
@@ -746,6 +746,10 @@ const meToast = {
} }
return new Promise((resolve) => { return new Promise((resolve) => {
let resolved = false;
const safeResolve = (val) => { if (!resolved) { resolved = true; clearTimeout(safetyTimeout); resolve(val); } };
const safetyTimeout = setTimeout(() => safeResolve(false), 10000);
const t = this._emit({ const t = this._emit({
...opts, ...opts,
type: opts.type || 'warning', type: opts.type || 'warning',
@@ -764,14 +768,14 @@ const meToast = {
if (confirmBtn) { if (confirmBtn) {
confirmBtn.addEventListener('click', () => { confirmBtn.addEventListener('click', () => {
t.close(); t.close();
resolve(true); safeResolve(true);
}); });
} }
if (cancelBtn) { if (cancelBtn) {
cancelBtn.addEventListener('click', () => { cancelBtn.addEventListener('click', () => {
t.close(); t.close();
resolve(false); safeResolve(false);
}); });
} }
}, 0); }, 0);
@@ -791,6 +795,10 @@ const meToast = {
} }
return new Promise((resolve) => { return new Promise((resolve) => {
let resolved = false;
const safeResolve = (val) => { if (!resolved) { resolved = true; clearTimeout(safetyTimeout); resolve(val); } };
const safetyTimeout = setTimeout(() => safeResolve(null), 10000);
const t = this._emit({ const t = this._emit({
...opts, ...opts,
type: opts.type || 'info', type: opts.type || 'info',
@@ -813,7 +821,7 @@ const meToast = {
input.addEventListener('keydown', (e) => { input.addEventListener('keydown', (e) => {
if (e.key === 'Enter') { if (e.key === 'Enter') {
t.close(); t.close();
resolve(input.value); safeResolve(input.value);
} }
}); });
} }
@@ -821,14 +829,14 @@ const meToast = {
if (submitBtn) { if (submitBtn) {
submitBtn.addEventListener('click', () => { submitBtn.addEventListener('click', () => {
t.close(); t.close();
resolve(input?.value || null); safeResolve(input?.value || null);
}); });
} }
if (cancelBtn) { if (cancelBtn) {
cancelBtn.addEventListener('click', () => { cancelBtn.addEventListener('click', () => {
t.close(); t.close();
resolve(null); safeResolve(null);
}); });
} }
}, 0); }, 0);