You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多API密钥调用异常:四次调用后未正确等待及循环失效排查

修复多Access Token轮询限流的循环逻辑问题

核心问题复盘

你遇到的问题根源有两个:

  • 原代码中token索引未正确遍历重置,导致仅第二个token被重复调用
  • 轮询的批次逻辑缺失,没有实现「4个token各调用一次 → 等待 → 重复轮询」的流程

修复后完整代码

// 修复后的wait函数,确保返回Promise
const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));

// 你的Access Token列表
const tokens = ['token1', 'token2', 'token3', 'token4'];

// 核心轮询函数
async function pollWithTokens() {
  while (true) { // 无限轮询,可根据需求加终止条件
    // 遍历所有token,完成一轮调用
    for (const token of tokens) {
      try {
        const response = await fetch('https://第三方API地址', {
          headers: {
            'Authorization': `Bearer ${token}`
            // 其他请求头
          }
          // 请求方法、body等参数
        });

        if (!response.ok) {
          throw new Error(`HTTP错误: ${response.status}`);
        }

        const data = await response.json();
        // 处理返回的数据
        console.log(`用token ${token.slice(-4)} 调用成功`, data);
      } catch (err) {
        console.error(`用token ${token.slice(-4)} 调用失败`, err);
        // 如果是限流错误,可额外处理(比如跳过当前token或延长等待)
        if (err.message.includes('429')) {
          console.log(`token ${token.slice(-4)} 触发限流,跳过当前轮次`);
        }
      }
    }
    // 一轮4个token调用完成后,等待指定时间再进入下一轮
    console.log('本轮调用完成,等待1分钟后继续...');
    await wait(60000); // 这里可根据API限流规则调整等待时间
  }
}

// 启动轮询
pollWithTokens();

关键修复点

  1. 正确的Token遍历逻辑:用for...of直接遍历tokens数组,确保每轮都会依次使用所有4个token,不会出现漏用或重复单个token的情况
  2. 批次等待逻辑:每轮遍历完所有token后才执行wait,严格遵循「一轮调用→等待→下一轮」的流程
  3. 完善的错误处理:捕获请求错误,针对限流(429)做特殊处理,避免单个token出错导致整个轮询中断
  4. 灵活的终止条件:当前用while(true)做无限轮询,你可以根据需求添加终止判断(比如达到调用次数、获取到目标数据等)

额外优化建议

  • 如果API对单个token的限流是「每分钟N次」,可以给每个token单独维护调用计数和冷却时间,实现更精准的限流规避
  • 可以添加token的健康检查,自动跳过连续触发限流的token,避免无效调用

内容的提问来源于stack exchange,提问作者G.Rose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:35:23