修复:防止异步响应覆盖与打印资源泄漏
This commit is contained in:
@@ -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("二维码获取失败");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user