如何在API响应的指定字段就绪后重试获取该字段
轮询获取就绪字段实现方案
核心思路
通过定时轮询重复调用API,直到目标字段返回符合预期的有效值,同时增加超时机制避免无限等待导致的资源浪费。
实现代码
const apiState = Date.now(); const callApi = () => Promise.resolve({ field: "xxx", asyncField: Date.now() - apiState > 10000 ? "aaa" : undefined }); // 通用延迟工具函数 const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); /** * 轮询等待API异步字段就绪 * @param {number} pollInterval 轮询间隔(毫秒),默认2秒 * @param {number} maxWaitTime 最大等待时长(毫秒),默认30秒 * @returns {Promise<string>} 就绪后的asyncField值 * @throws 超时时抛出错误 */ async function waitForApiReady(pollInterval = 2000, maxWaitTime = 30000) { const startTimestamp = Date.now(); while (true) { // 触发超时判定 if (Date.now() - startTimestamp > maxWaitTime) { throw new Error('等待异步字段就绪超时,请稍后重试'); } const response = await callApi(); // 自定义字段就绪判定逻辑,可根据业务场景调整 if (response.asyncField !== undefined) { return response.asyncField; } // 等待指定间隔后发起下一次请求 await delay(pollInterval); } } // 调用测试 waitForApiReady().then(console.log).catch(console.error);
注意事项
- 轮询间隔建议根据API限流规则设置,不要设置过短导致触发接口频率限制,普通业务场景建议设置在1~5秒区间
- 最大等待时长建议参考对应API的官方文档给出的字段就绪最大耗时,预留20%~50%的冗余量即可
- 如果对应API支持Webhook回调、WebSocket主动推送等能力,优先使用推送方案替代轮询,资源消耗更低、响应时延更短
内容的提问来源于stack exchange,提问作者ikhvjs
相关产品推荐
相关产品推荐

