多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();
关键修复点
- 正确的Token遍历逻辑:用
for...of直接遍历tokens数组,确保每轮都会依次使用所有4个token,不会出现漏用或重复单个token的情况 - 批次等待逻辑:每轮遍历完所有token后才执行
wait,严格遵循「一轮调用→等待→下一轮」的流程 - 完善的错误处理:捕获请求错误,针对限流(429)做特殊处理,避免单个token出错导致整个轮询中断
- 灵活的终止条件:当前用
while(true)做无限轮询,你可以根据需求添加终止判断(比如达到调用次数、获取到目标数据等)
额外优化建议
- 如果API对单个token的限流是「每分钟N次」,可以给每个token单独维护调用计数和冷却时间,实现更精准的限流规避
- 可以添加token的健康检查,自动跳过连续触发限流的token,避免无效调用
内容的提问来源于stack exchange,提问作者G.Rose
相关产品推荐
相关产品推荐

