修复:防止异步响应覆盖与打印资源泄漏

This commit is contained in:
焦龙言
2026-07-27 05:44:20 +08:00
parent 137b2934f7
commit 2d2b3cf6c6
3 changed files with 65 additions and 11 deletions
@@ -104,6 +104,7 @@ const users = ref([]);
const selectedUserIds = ref([]);
const userTableRef = ref();
const restoringSelection = ref(false);
let loadGeneration = 0;
const dialogTitle = computed(() => {
const label = resourceType.value === "site" ? "客户现场" : "仓库";
@@ -171,12 +172,26 @@ function handleRowClick(row, column) {
restoreSelection();
}
function isCurrentUserLoad(loadContext) {
return loadContext.generation === loadGeneration
&& loadContext.resourceType === resourceType.value
&& loadContext.resourceId === resourceId.value;
}
function loadUsers() {
const resourceApi = resourceApiMap[resourceType.value];
const loadContext = {
generation: ++loadGeneration,
resourceType: resourceType.value,
resourceId: resourceId.value
};
const resourceApi = resourceApiMap[loadContext.resourceType];
loading.value = true;
loadFailed.value = false;
loadError.value = "";
resourceApi.getUsers(resourceId.value).then((response) => {
resourceApi.getUsers(loadContext.resourceId).then((response) => {
if (!isCurrentUserLoad(loadContext)) {
return;
}
const rows = Array.isArray(response.data) ? response.data : [];
users.value = normalizeUserRows(rows);
selectedUserIds.value = users.value
@@ -184,16 +199,24 @@ function loadUsers() {
.map((user) => user.userId);
restoreSelection();
}).catch(() => {
if (!isCurrentUserLoad(loadContext)) {
return;
}
users.value = [];
selectedUserIds.value = [];
loadError.value = "用户列表加载失败,请稍后重试";
loadFailed.value = true;
}).finally(() => {
if (!isCurrentUserLoad(loadContext)) {
return;
}
loading.value = false;
});
}
function resetDialogState() {
loadGeneration += 1;
loading.value = false;
loadError.value = "";
keyword.value = "";
resourceType.value = "";
@@ -255,14 +255,25 @@ function handlePrint(row) {
}
let objectUrl;
let closeMonitorId;
let cleanupFinished = false;
setPrinting(row.palletId, true);
const revokeObjectUrl = () => {
const cleanupPrint = () => {
if (cleanupFinished) return;
cleanupFinished = true;
if (closeMonitorId !== undefined) {
window.clearInterval(closeMonitorId);
closeMonitorId = undefined;
}
if (objectUrl) {
URL.revokeObjectURL(objectUrl);
objectUrl = undefined;
}
setPrinting(row.palletId, false);
};
closeMonitorId = window.setInterval(() => {
if (printWindow.closed) cleanupPrint();
}, 250);
getPalletQrcode(row.palletId).then((qrCodeBlob) => {
if (printWindow.closed) throw new Error("打印窗口已关闭");
@@ -282,16 +293,12 @@ function handlePrint(row) {
printWindow.print();
}, { once: true });
imageElement.addEventListener("error", () => {
revokeObjectUrl();
cleanupPrint();
printWindow.close();
proxy.$modal.msgError("二维码图片加载失败");
}, { once: true });
printWindow.addEventListener("afterprint", () => {
if (objectUrl) {
URL.revokeObjectURL(objectUrl);
objectUrl = undefined;
}
setPrinting(row.palletId, false);
cleanupPrint();
printWindow.close();
}, { once: true });
@@ -299,7 +306,7 @@ function handlePrint(row) {
printWindow.document.head.append(styleElement);
printWindow.document.body.replaceChildren(titleElement, imageElement);
}).catch(() => {
revokeObjectUrl();
cleanupPrint();
if (!printWindow.closed) printWindow.close();
proxy.$modal.msgError("二维码获取失败");
});