From bb5bed014cd86fd1af3bc1072e7bf44a1ec59d35 Mon Sep 17 00:00:00 2001 From: Zzc <1373857752@qq.com> Date: Thu, 27 Nov 2025 17:12:32 +0800 Subject: [PATCH] =?UTF-8?q?refactor(3d-situational-awareness):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=87=E7=89=87=E9=9B=86=E5=8A=A0=E8=BD=BD=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=EF=BC=8C=E5=BC=95=E5=85=A5=E6=B8=85=E7=90=86=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=E4=B8=8E=E6=8F=90=E5=89=8D=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增统一的清理函数,用于处理超时及移除事件监听器。 针对已加载切片引入提前退出检查,从而避免冗余等待。 强化错误处理机制,用于区分超时错误,并确保在 `finally` 块中执行清理操作。 --- .../composables/use3DTiles.js | 58 +++++++++++++------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/packages/screen/src/views/3DSituationalAwarenessRefactor/composables/use3DTiles.js b/packages/screen/src/views/3DSituationalAwarenessRefactor/composables/use3DTiles.js index 4e40916..3e26c6a 100644 --- a/packages/screen/src/views/3DSituationalAwarenessRefactor/composables/use3DTiles.js +++ b/packages/screen/src/views/3DSituationalAwarenessRefactor/composables/use3DTiles.js @@ -87,46 +87,66 @@ export function use3DTiles() { return } + let timeoutId = null + let eventHandler = null + + // 统一清理函数 + const cleanup = () => { + if (timeoutId) { + clearTimeout(timeoutId) + timeoutId = null + } + if (eventHandler) { + tileset.initialTilesLoaded.removeEventListener(eventHandler) + eventHandler = null + } + } + try { // 步骤1:等待 Tileset 基础就绪 await tileset.readyPromise console.log('[use3DTiles] Tileset readyPromise 已完成') - // 步骤2:等待初始瓦片加载完成(带超时) + // 步骤2:早期出口 - 快速检查 + if (tileset.tilesLoaded) { + console.log('[use3DTiles] 瓦片已加载,直接继续') + return + } + + // 步骤3:等待初始瓦片加载完成(带超时) console.log('[use3DTiles] 等待初始瓦片加载...') await Promise.race([ - // 等待initialTilesLoaded事件 + // 等待 initialTilesLoaded 事件 new Promise((resolve) => { - const handleInitialTilesLoaded = () => { + eventHandler = () => { console.log('[use3DTiles] 初始瓦片加载完成(事件触发)') - tileset.initialTilesLoaded.removeEventListener(handleInitialTilesLoaded) - resolve() - } - - tileset.initialTilesLoaded.addEventListener(handleInitialTilesLoaded) - - // 如果已经加载完成,可能事件已经触发过了,直接resolve - // 通过检查tileset.tilesLoaded来判断 - if (tileset.tilesLoaded) { - console.log('[use3DTiles] 瓦片已加载,直接继续') - tileset.initialTilesLoaded.removeEventListener(handleInitialTilesLoaded) + cleanup() resolve() } + tileset.initialTilesLoaded.addEventListener(eventHandler) }), + // 超时机制 - new Promise((resolve) => { - setTimeout(() => { - console.warn(`[use3DTiles] 等待瓦片加载超时(${timeout}ms),继续执行`) - resolve() + new Promise((_, reject) => { + timeoutId = setTimeout(() => { + cleanup() + reject(new Error(`等待瓦片加载超时(${timeout}ms)`)) }, timeout) }) ]) console.log('[use3DTiles] Tileset 已完全就绪') } catch (error) { - console.error('[use3DTiles] 等待 Tileset 就绪失败:', error) + if (error.message && error.message.includes('超时')) { + // 超时但继续执行(保持原有行为) + console.warn(`[use3DTiles] ${error.message},继续执行`) + } else { + console.error('[use3DTiles] 等待 Tileset 就绪失败:', error) + } // 即使失败也不抛出异常,允许程序继续执行 + } finally { + cleanup() // 保险清理 } }