hookehuyr

fix(AdPage): 修复广告图片加载逻辑并优化错误处理

改进广告图片加载失败时的重试机制,增加状态管理和错误处理
调整超时处理逻辑,避免频繁请求
添加必要的日志输出以便调试
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;
......