【MoodVine】Taro+React对于大文件的轮询请求实现

在之前的博客中,我们通过promise延迟对音频资源的访问,给其足够的加载时间,但是由于资源大小的不确定,5s的等待时间对于大部分较短音频来说太长了;而对于部分较长回答,5s也不足以加载完成,笨人不想做分块,所以想通过轮询访问来动态调整加载时间,优化访问速度

方案核心设计

  1. 智能轮询机制
    • 使用递归 Promise 实现自动重试
    • 指数退避策略避免服务器过载
    • 最大尝试次数限制防止无限循环
  2. 双层检测优化
  1. 自适应策略
    • 初始延迟:1秒(小资源快速响应)
    • 指数退避:每次失败等待时间加倍(最大到30秒)
    • 智能判断:针对404错误特殊处理,其他错误保持短间隔
  2. 错误处理增强
    • 区分临时错误和永久错误
    • 详细日志记录每次尝试状态
    • 最终聚合错误信息

最终实现如下

javascript 复制代码
function smartResourceLoader(url, maxAttempts = 10, initialDelay = 1000) {
  return new Promise(async (resolve, reject) => {
    let attempt = 0;
    let delayTime = initialDelay;
    
    const attemptLoad = async () => {
      attempt++;
      try {
        console.log(`尝试加载资源 (第 ${attempt} 次): ${url}`);
        
        // 先检查资源是否存在(使用HEAD请求减少带宽消耗)
        const headRes = await Taro.request({
          url,
          method: 'HEAD',
          timeout: 3000
        });
        
        if (headRes.statusCode === 404) {
          throw new Error('资源尚未就绪 (404)');
        }
        
        // 资源存在时才执行完整操作
        handleAudioToggle(url);
        console.log(`资源加载成功: ${url}`);
        resolve();
      } catch (error) {
        console.warn(`资源加载失败: ${error.message}`);
        
        // 指数退避策略:每次失败后等待时间加倍
        delayTime *= 2;
        
        if (attempt >= maxAttempts) {
          reject(new Error(`资源加载失败,超过最大尝试次数 (${maxAttempts}次)`));
          return;
        }
        
        // 智能等待:根据错误类型调整策略
        const nextDelay = error.message.includes('404') ? delayTime : 1000;
        console.log(`等待 ${nextDelay}ms 后重试...`);
        
        await new Promise(res => setTimeout(res, nextDelay));
        attemptLoad();
      }
    };
    
    attemptLoad();
  });
}
相关推荐
Hilaku4 分钟前
为什么跳槽涨薪 30% 的时代彻底结束了?聊聊 2026 前端薪资的天花板
前端·javascript·程序员
愚公搬代码16 分钟前
【愚公系列】《Web应用安全》006-HackBar插件的使用
前端·安全
超爱吃香菜的菜鸟37 分钟前
关于pnpm 部分使用(一)
前端·vue.js
Vuji44 分钟前
Pi 插件解剖|git-checkpoint.ts:只用 53 行,让 fork 恢复代码状态
前端·agent
大家的林语冰1 小时前
✌️ 让 Rust 再次伟大,pnpm 12 抛弃 TypeScript,移植 Rust 原地起飞!
前端·javascript·node.js
XPoet2 小时前
AI 编程工程化:实战——从 0 到 1 搭建 AI 编程工作流
前端·后端·ai编程
-今昭-2 小时前
Logstash 管理
java·服务器·前端
名字还没想好☜2 小时前
React 用自定义 useDebounce Hook 治好搜索框频繁请求:防抖、竞态取消与卸载清理
前端·javascript·react.js·react·hooks
杉氧3 小时前
Flutter 跨平台多端适配与 Android/iOS 一键自动化打包发布
android·前端·flutter
障碍的枫子3 小时前
xss和CSRF的攻击和防御
前端·xss·csrf