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() // 保险清理 } }