fix(AdPage): 修复广告图片加载逻辑并优化错误处理
改进广告图片加载失败时的重试机制,增加状态管理和错误处理 调整超时处理逻辑,避免频繁请求 添加必要的日志输出以便调试
Showing
2 changed files
with
64 additions
and
15 deletions
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2025-01-09 00:00:00 | 2 | * @Date: 2025-01-09 00:00:00 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-09-28 11:28:21 | 4 | + * @LastEditTime: 2025-09-28 14:00:58 |
| 5 | * @FilePath: /lls_program/src/components/RankingCard.vue | 5 | * @FilePath: /lls_program/src/components/RankingCard.vue |
| 6 | * @Description: 排行榜卡片组件 | 6 | * @Description: 排行榜卡片组件 |
| 7 | --> | 7 | --> |
| ... | @@ -608,7 +608,7 @@ defineExpose({ | ... | @@ -608,7 +608,7 @@ defineExpose({ |
| 608 | font-size: 20rpx; | 608 | font-size: 20rpx; |
| 609 | margin-bottom: 12rpx; | 609 | margin-bottom: 12rpx; |
| 610 | text-align: center; | 610 | text-align: center; |
| 611 | - max-width: 120rpx; | 611 | + max-width: 140rpx; |
| 612 | overflow: hidden; | 612 | overflow: hidden; |
| 613 | text-overflow: ellipsis; | 613 | text-overflow: ellipsis; |
| 614 | display: -webkit-box; | 614 | display: -webkit-box; | ... | ... |
| ... | @@ -146,11 +146,13 @@ const handleImageClick = () => { | ... | @@ -146,11 +146,13 @@ const handleImageClick = () => { |
| 146 | * 图片加载完成处理 | 146 | * 图片加载完成处理 |
| 147 | */ | 147 | */ |
| 148 | const handleImageLoad = () => { | 148 | const handleImageLoad = () => { |
| 149 | + console.log('图片加载成功'); | ||
| 149 | clearLoadingTimeout(); | 150 | clearLoadingTimeout(); |
| 150 | imageLoading.value = false; | 151 | imageLoading.value = false; |
| 151 | imageLoadError.value = false; | 152 | imageLoadError.value = false; |
| 152 | isTimeout.value = false; | 153 | isTimeout.value = false; |
| 153 | showManualRefresh.value = false; | 154 | showManualRefresh.value = false; |
| 155 | + loading.value = false; | ||
| 154 | retryCount.value = 0; | 156 | retryCount.value = 0; |
| 155 | }; | 157 | }; |
| 156 | 158 | ||
| ... | @@ -158,26 +160,45 @@ const handleImageLoad = () => { | ... | @@ -158,26 +160,45 @@ const handleImageLoad = () => { |
| 158 | * 图片加载失败处理 | 160 | * 图片加载失败处理 |
| 159 | */ | 161 | */ |
| 160 | const handleImageError = () => { | 162 | const handleImageError = () => { |
| 163 | + console.log('图片加载失败'); | ||
| 161 | clearLoadingTimeout(); | 164 | clearLoadingTimeout(); |
| 162 | imageLoading.value = false; | 165 | imageLoading.value = false; |
| 163 | imageLoadError.value = true; | 166 | imageLoadError.value = true; |
| 164 | - handleLoadingTimeout(); | 167 | + // 不要在这里直接调用handleLoadingTimeout,让重试逻辑统一处理 |
| 168 | + setTimeout(() => { | ||
| 169 | + handleLoadingTimeout(); | ||
| 170 | + }, 100); | ||
| 165 | }; | 171 | }; |
| 166 | 172 | ||
| 167 | /** | 173 | /** |
| 168 | * 重试加载图片 | 174 | * 重试加载图片 |
| 169 | */ | 175 | */ |
| 170 | -const retryLoadImage = () => { | 176 | +const retryLoadImage = async () => { |
| 177 | + // 重置状态 | ||
| 171 | imageLoading.value = true; | 178 | imageLoading.value = true; |
| 172 | imageLoadError.value = false; | 179 | imageLoadError.value = false; |
| 173 | isTimeout.value = false; | 180 | isTimeout.value = false; |
| 174 | showManualRefresh.value = false; | 181 | showManualRefresh.value = false; |
| 182 | + loading.value = true; | ||
| 175 | 183 | ||
| 176 | - // 开始超时检测 | 184 | + try { |
| 177 | - startLoadingTimeout(); | 185 | + // 开始超时检测 |
| 186 | + startLoadingTimeout(); | ||
| 178 | 187 | ||
| 179 | - // 重新获取广告配置 | 188 | + // 重新获取广告配置 |
| 180 | - fetchAdConfig(); | 189 | + await fetchAdConfig(); |
| 190 | + | ||
| 191 | + // 广告配置成功后,清除超时定时器 | ||
| 192 | + clearLoadingTimeout(); | ||
| 193 | + imageLoading.value = false; | ||
| 194 | + | ||
| 195 | + } catch (error) { | ||
| 196 | + console.error('重试获取广告配置失败:', error); | ||
| 197 | + // 重试失败时触发超时处理 | ||
| 198 | + handleLoadingTimeout(); | ||
| 199 | + } finally { | ||
| 200 | + loading.value = false; | ||
| 201 | + } | ||
| 181 | }; | 202 | }; |
| 182 | 203 | ||
| 183 | /** | 204 | /** |
| ... | @@ -185,13 +206,11 @@ const retryLoadImage = () => { | ... | @@ -185,13 +206,11 @@ const retryLoadImage = () => { |
| 185 | */ | 206 | */ |
| 186 | const startLoadingTimeout = () => { | 207 | const startLoadingTimeout = () => { |
| 187 | // 清除之前的定时器 | 208 | // 清除之前的定时器 |
| 188 | - if (loadingTimeout.value) { | 209 | + clearLoadingTimeout(); |
| 189 | - clearTimeout(loadingTimeout.value); | ||
| 190 | - } | ||
| 191 | 210 | ||
| 192 | // 设置10秒超时 | 211 | // 设置10秒超时 |
| 193 | loadingTimeout.value = setTimeout(() => { | 212 | loadingTimeout.value = setTimeout(() => { |
| 194 | - if (imageLoading.value) { | 213 | + if (imageLoading.value || loading.value) { |
| 195 | console.warn('图片加载超时'); | 214 | console.warn('图片加载超时'); |
| 196 | isTimeout.value = true; | 215 | isTimeout.value = true; |
| 197 | handleLoadingTimeout(); | 216 | handleLoadingTimeout(); |
| ... | @@ -203,14 +222,22 @@ const startLoadingTimeout = () => { | ... | @@ -203,14 +222,22 @@ const startLoadingTimeout = () => { |
| 203 | * 处理加载超时 | 222 | * 处理加载超时 |
| 204 | */ | 223 | */ |
| 205 | const handleLoadingTimeout = () => { | 224 | const handleLoadingTimeout = () => { |
| 225 | + // 清除超时定时器 | ||
| 226 | + clearLoadingTimeout(); | ||
| 227 | + | ||
| 206 | if (retryCount.value < maxRetries.value) { | 228 | if (retryCount.value < maxRetries.value) { |
| 207 | // 自动重试 | 229 | // 自动重试 |
| 208 | retryCount.value++; | 230 | retryCount.value++; |
| 209 | console.log(`第${retryCount.value}次自动重试加载`); | 231 | console.log(`第${retryCount.value}次自动重试加载`); |
| 210 | - retryLoadImage(); | 232 | + |
| 233 | + // 延迟1秒后重试,避免频繁请求 | ||
| 234 | + setTimeout(() => { | ||
| 235 | + retryLoadImage(); | ||
| 236 | + }, 1000); | ||
| 211 | } else { | 237 | } else { |
| 212 | // 超过最大重试次数,显示手动刷新选项 | 238 | // 超过最大重试次数,显示手动刷新选项 |
| 213 | imageLoading.value = false; | 239 | imageLoading.value = false; |
| 240 | + loading.value = false; | ||
| 214 | showManualRefresh.value = true; | 241 | showManualRefresh.value = true; |
| 215 | console.error('图片加载失败,已达到最大重试次数'); | 242 | console.error('图片加载失败,已达到最大重试次数'); |
| 216 | } | 243 | } |
| ... | @@ -231,6 +258,9 @@ const clearLoadingTimeout = () => { | ... | @@ -231,6 +258,9 @@ const clearLoadingTimeout = () => { |
| 231 | */ | 258 | */ |
| 232 | const initializePage = async () => { | 259 | const initializePage = async () => { |
| 233 | try { | 260 | try { |
| 261 | + // 重置重试计数 | ||
| 262 | + retryCount.value = 0; | ||
| 263 | + | ||
| 234 | // 开始超时检测 | 264 | // 开始超时检测 |
| 235 | startLoadingTimeout(); | 265 | startLoadingTimeout(); |
| 236 | 266 | ||
| ... | @@ -254,18 +284,37 @@ const initializePage = async () => { | ... | @@ -254,18 +284,37 @@ const initializePage = async () => { |
| 254 | if (!adConfigSuccess) { | 284 | if (!adConfigSuccess) { |
| 255 | try { | 285 | try { |
| 256 | await fetchAdConfig(); | 286 | await fetchAdConfig(); |
| 287 | + adConfigSuccess = true; | ||
| 257 | console.log('重试获取广告配置成功'); | 288 | console.log('重试获取广告配置成功'); |
| 258 | } catch (retryError) { | 289 | } catch (retryError) { |
| 259 | console.error('重试获取广告配置仍然失败:', retryError); | 290 | console.error('重试获取广告配置仍然失败:', retryError); |
| 260 | } | 291 | } |
| 261 | } | 292 | } |
| 293 | + | ||
| 294 | + // 如果广告配置成功,清除超时定时器并设置成功状态 | ||
| 295 | + if (adConfigSuccess) { | ||
| 296 | + clearLoadingTimeout(); | ||
| 297 | + imageLoading.value = false; | ||
| 298 | + imageLoadError.value = false; | ||
| 299 | + } else { | ||
| 300 | + // 广告配置失败,触发重试逻辑 | ||
| 301 | + imageLoadError.value = true; | ||
| 302 | + handleLoadingTimeout(); | ||
| 303 | + } | ||
| 304 | + | ||
| 262 | } catch (familyError) { | 305 | } catch (familyError) { |
| 263 | console.error('检查家庭状态失败:', familyError); | 306 | console.error('检查家庭状态失败:', familyError); |
| 264 | - throw familyError; // 家庭状态检查失败需要抛出错误 | 307 | + // 家庭状态检查失败,但仍然尝试显示广告 |
| 308 | + if (adConfigSuccess) { | ||
| 309 | + clearLoadingTimeout(); | ||
| 310 | + imageLoading.value = false; | ||
| 311 | + } else { | ||
| 312 | + handleLoadingTimeout(); | ||
| 313 | + } | ||
| 265 | } | 314 | } |
| 266 | } catch (error) { | 315 | } catch (error) { |
| 267 | console.error('页面初始化失败:', error); | 316 | console.error('页面初始化失败:', error); |
| 268 | - // 初始化失败时也要处理超时 | 317 | + // 初始化失败时处理超时 |
| 269 | handleLoadingTimeout(); | 318 | handleLoadingTimeout(); |
| 270 | } finally { | 319 | } finally { |
| 271 | loading.value = false; | 320 | loading.value = false; | ... | ... |
-
Please register or login to post a comment