修复首页模型加载超时切换室外地图
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-16 00:05:18 +08:00
parent 96541c5a89
commit 6db0b71562
2 changed files with 197 additions and 30 deletions

View File

@@ -449,6 +449,7 @@ let launchOverlayFallbackTimer: ReturnType<typeof setTimeout> | null = null
let launchOverlayFadeTimer: ReturnType<typeof setTimeout> | null = null
let launchOverlayHideDelayTimer: ReturnType<typeof setTimeout> | null = null
let launchOverlayStartedAt = 0
let launchOverlayRunId = 0
const clearLaunchTimers = () => {
if (launchOverlayFallbackTimer) {
@@ -470,11 +471,13 @@ const clearLaunchTimers = () => {
const completeHideLaunchOverlay = () => {
if (!launchOverlayVisible.value) return
const runId = launchOverlayRunId
launchProgress.value = 100
launchOverlayLeaving.value = true
clearLaunchTimers()
launchOverlayFadeTimer = setTimeout(() => {
if (runId !== launchOverlayRunId) return
launchOverlayVisible.value = false
launchOverlayLeaving.value = false
launchOverlayFadeTimer = null
@@ -489,7 +492,9 @@ const hideLaunchOverlay = () => {
if (waitMs > 0) {
if (launchOverlayHideDelayTimer) clearTimeout(launchOverlayHideDelayTimer)
const runId = launchOverlayRunId
launchOverlayHideDelayTimer = setTimeout(() => {
if (runId !== launchOverlayRunId) return
launchOverlayHideDelayTimer = null
completeHideLaunchOverlay()
}, waitMs)
@@ -504,21 +509,18 @@ const shouldWaitForLaunchModel = () => (
&& is3DMode.value
)
const continueLaunchWithoutInitialModel = (reason: string, event?: { view: GuideIndoorView; floorId?: string; message?: string; elapsedMs?: number }) => {
// The launch overlay is independent from the selected map business mode. Releasing it
// must leave ThreeMap mounted so its loading/error/retry lifecycle can continue.
const releaseLaunchOverlayWithoutInitialModel = (reason: string, event?: { view: GuideIndoorView; floorId?: string; message?: string; elapsedMs?: number }) => {
if (!launchOverlayVisible.value || launchOverlayLeaving.value) return
console.warn('首页前置加载页未等待初始三维模型,已进入馆外导览:', {
console.warn('首页前置加载页未等待初始三维模型,已关闭启动遮罩:', {
reason,
event
})
launchInitialModelSettled.value = true
launchProgress.value = Math.max(launchProgress.value, 96)
is3DMode.value = false
guideOutdoorState.value = 'home'
selectedGuidePoi.value = null
isPoiCardCollapsed.value = false
isSimulatingRoute.value = false
hideLaunchOverlay()
}
@@ -526,6 +528,7 @@ const startLaunchOverlay = () => {
if (!launchOverlayVisible.value) return
clearLaunchTimers()
const runId = ++launchOverlayRunId
launchInitialModelSettled.value = false
launchOverlayStartedAt = Date.now()
launchProgress.value = shouldWaitForLaunchModel() ? 8 : 68
@@ -535,8 +538,9 @@ const startLaunchOverlay = () => {
: launchOverlayNonGuideTimeoutMs
launchOverlayFallbackTimer = setTimeout(() => {
if (runId !== launchOverlayRunId) return
if (shouldWaitForLaunchModel() && !launchInitialModelSettled.value) {
continueLaunchWithoutInitialModel('timeout')
releaseLaunchOverlayWithoutInitialModel('timeout')
return
}
hideLaunchOverlay()
@@ -553,7 +557,7 @@ const settleLaunchOverlayByModel = (status: 'ready' | 'failed', event?: { view:
launchInitialModelSettled.value = true
if (status === 'failed') {
continueLaunchWithoutInitialModel('failed', event)
releaseLaunchOverlayWithoutInitialModel('failed', event)
return
} else {
launchProgress.value = 100
@@ -885,6 +889,7 @@ onMounted(() => {
})
onUnmounted(() => {
launchOverlayRunId += 1
clearLaunchTimers()
if (indoorGestureHintTimer) {