refactor(3d-situational-awareness): 优化切片集加载流程,引入清理机制与提前退出
新增统一的清理函数,用于处理超时及移除事件监听器。 针对已加载切片引入提前退出检查,从而避免冗余等待。 强化错误处理机制,用于区分超时错误,并确保在 `finally` 块中执行清理操作。
This commit is contained in:
parent
dc4c88acb5
commit
bb5bed014c
@ -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) {
|
||||
if (error.message && error.message.includes('超时')) {
|
||||
// 超时但继续执行(保持原有行为)
|
||||
console.warn(`[use3DTiles] ${error.message},继续执行`)
|
||||
} else {
|
||||
console.error('[use3DTiles] 等待 Tileset 就绪失败:', error)
|
||||
}
|
||||
// 即使失败也不抛出异常,允许程序继续执行
|
||||
} finally {
|
||||
cleanup() // 保险清理
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user