Axios 异步请求的条件式重试与状态检测

Axios 异步请求的条件式重试与状态检测

本教程详细探讨了如何使用 Axios 实现 API 请求的条件式重试机制。当异步操作的响应状态(如 response.data.status)未达到预期值时,我们将学习如何通过设置最大重试次数和引入重试间隔,优雅地、高效地反复发起请求,直至满足特定条件或达到重试上限,确保数据一致性和应用健壮性。

理解 API 条件式重试的必要性

在现代web应用开发中,与后端api交互是常态。许多异步操作,例如文件处理、数据转换或复杂计算,可能不会立即返回最终结果。api通常会返回一个中间状态(如”pending”、”processing”),然后需要客户端轮询(poll)直至返回最终成功状态(如”done”、”completed”)。在这种场景下,简单地发起一次请求是不够的,我们需要一种机制来:

等待特定状态: 持续检查响应中的某个字段,直到其值符合预期。处理临时错误: 在网络波动、服务器瞬时过载等情况下,重试可以提高请求的成功率。避免无限循环: 设置最大重试次数,防止因API长时间无响应或逻辑错误导致的资源耗尽。优化资源使用: 引入重试间隔,避免对API造成过大压力,同时为后端处理争取时间。

核心重试策略

实现条件式重试的核心策略是结合异步编程(async/await)、循环结构和延迟机制。我们将构建一个通用的重试函数,它能够:

循环发起请求: 使用 while 循环在达到最大重试次数前持续尝试。检查响应状态: 在每次请求成功后,检查 response.data.status 是否等于目标值。引入延迟: 在每次重试前暂停一段时间,通常采用指数退避(Exponential Backoff)策略,即每次失败后增加延迟时间。统一错误处理: 捕获网络错误或API返回的错误,并在重试次数耗尽后抛出。

实现步骤与示例代码

下面我们将通过一个具体的 Axios 请求示例,演示如何构建一个健壮的条件式重试函数。

1. 初始化 Axios 配置

首先,我们需要设置 Axios 请求的基本配置,包括请求方法、URL、头部信息和数据。这里我们使用 qs 库来序列化数据,以适应 application/x-www-form-urlencoded 内容类型。

const axios = require("axios");const qs = require("qs");// 假设 apiKey 在当前作用域内可用,请替换为你的实际API密钥const apiKey = "YOUR_DEEPL_API_KEY";const initialConfig = {    method: "post",    maxBodyLength: Infinity, // 允许最大请求体长度    url: "https://api-free.deepl.com/v2/document/95BA71197AC66EE4745FF5269CF4399D",    headers: {        Authorization: `DeepL-Auth-Key ${apiKey}`, // DeepL API 密钥通常这样传递        "Content-Type": "application/x-www-form-urlencoded",    },    data: qs.stringify({        document_key: "038A2E0792CE72020E9BB88380D002EB582A6B3AE5883C34DE53C9F17D415D99",    }),};

2. 定义延迟辅助函数

为了在重试之间引入暂停,我们需要一个简单的 delay 函数。

/** * 引入延迟的辅助函数 * @param {number} ms - 延迟毫秒数 */const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

3. 构建条件式重试函数

现在,我们将核心逻辑封装在一个 async 函数中,它将处理重试逻辑、状态检查、延迟和错误处理。

/** * 重试 API 请求直到特定状态或达到最大重试次数 * @param {object} config - Axios 请求配置 * @param {string} targetStatus - 期望的响应状态值 * @param {number} maxRetries - 最大重试次数 * @param {number} initialDelayMs - 初始重试延迟(毫秒) * @returns {Promise} - 成功时的响应数据 * @throws {Error} - 如果重试失败或达到最大重试次数 */async function retryApiRequestUntilStatus(    config,    targetStatus,    maxRetries = 5,    initialDelayMs = 1000) {    let attempts = 0;    let currentDelay = initialDelayMs; // 当前延迟时间,用于指数退避    while (attempts < maxRetries) {        attempts++;        try {            console.log(`尝试发起请求 (第 ${attempts} 次)...`);            const response = await axios.request(config);            const status = response.data.status;            if (status === targetStatus) {                console.log(`请求成功,状态为 "${targetStatus}"。`);                return response.data; // 返回完整的响应数据            } else {                console.log(`当前状态为 "${status}",不符合预期 "${targetStatus}"。`);                if (attempts < maxRetries) {                    console.log(`等待 ${currentDelay / 1000} 秒后重试...`);                    await delay(currentDelay);                    // 实现指数退避:每次重试失败后增加延迟时间                    currentDelay = Math.min(currentDelay * 2, 60000); // 最大延迟不超过60秒                }            }        } catch (error) {            console.error(`请求失败 (第 ${attempts} 次): ${error.message}`);            if (attempts < maxRetries) {                console.log(`等待 ${currentDelay / 1000} 秒后重试...`);                await delay(currentDelay);                currentDelay = Math.min(currentDelay * 2, 60000); // 最大延迟不超过60秒            } else {                // 达到最大重试次数后,抛出错误                throw new Error(`API 请求在 ${maxRetries} 次尝试后仍未成功:${error.message}`);            }        }    }    // 循环结束,但未达到目标状态    throw new Error(`API 请求在 ${maxRetries} 次尝试后仍未达到状态 "${targetStatus}"。`);}

4. 示例调用

最后,我们可以在一个立即执行的异步函数中调用这个重试逻辑。

// 示例调用(async () => {    try {        const result = await retryApiRequestUntilStatus(            initialConfig,            "done",      // 期望的目标状态            10,          // 最大重试次数            500          // 初始延迟 500 毫秒        );        console.log("最终结果:", result);    } catch (error) {        console.error("操作失败:", error.message);    }})();

关键考量与最佳实践

在实现条件式重试机制时,除了上述代码,还有一些重要的考量和最佳实践:

重试间隔与指数退避:

固定间隔: 每次重试间隔相同。简单,但可能在后端繁忙时加剧压力。指数退避(Exponential Backoff): 每次重试失败后,将等待时间呈指数级增长(例如 1s, 2s, 4s, 8s…)。这是一种更推荐的策略,可以有效减少对服务器的冲击,并给服务器留出恢复时间。务必设置一个最大延迟时间,防止延迟过长。抖动(Jitter): 在指数退避的基础上,引入随机性(例如在 currentDelay 的 50% 到 100% 之间随机选择延迟时间)。这有助于避免所有客户端在同一时刻重试,进一步分散服务器压力。

最大重试次数:

设置合理的 maxRetries 值至关重要。过少可能导致合法请求失败,过多则可能长时间占用资源或导致无限循环。根据业务场景和API的预期响应时间来确定。

幂等性:

确保重试的API请求是幂等的。这意味着多次执行相同的请求,其结果与执行一次请求的效果相同。例如,GET 请求通常是幂等的,而 POST 创建资源可能不是。如果请求不是幂等的,重试可能会导致意外的副作用(如重复创建资源)。对于非幂等操作,需要后端提供额外的机制(如唯一的请求ID)来处理重试。

用户体验:

如果重试过程可能持续较长时间,考虑向用户提供加载指示或进度更新。避免长时间无响应,这会损害用户体验。在某些情况下,可以考虑在达到一定重试次数后提示用户稍后重试,而不是一直等待。

日志记录与监控:

在重试逻辑中加入详细的日志记录,包括每次尝试的次数、当前状态、错误信息和延迟时间。这对于调试和理解系统行为至关重要。结合监控系统,可以及时发现并解决重试次数异常增高的问题。

错误分类:

并非所有错误都适合重试。例如,如果API返回 400 Bad Request(客户端错误),重试是没有意义的,因为请求本身就是无效的。通常只对 5xx 系列服务器错误、网络超时或特定业务状态进行重试。可以根据 error.response.status 或 error.code 来细化错误处理逻辑。

总结

通过本教程,我们学习了如何构建一个健壮的 Axios 条件式重试机制,以应对异步API操作中常见的轮询需求和临时性故障。这种模式不仅提高了应用程序的韧性,确保了数据最终的一致性,同时也通过合理的延迟和重试限制,维护了与API服务之间的良好交互。在实际项目中,根据具体业务场景和API特性,灵活调整重试策略和参数,将是构建高可靠性应用的关键。

以上就是Axios 异步请求的条件式重试与状态检测的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1519185.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
动态导入任意JS模块在基于Webpack构建的React应用中
上一篇 2025年12月20日 12:12:58
基于AJAX与PHP/MySQL实现成绩百分比数据保存教程
下一篇 2025年12月20日 12:13:16

相关推荐

  • 飞书桌面端闪退问题 飞书程序错误修复办法

    飞书桌面端闪退问题 飞书程序错误修复办法飞书桌面端闪退问题 飞书程序错误修复办法飞书桌面端闪退问题 飞书程序错误修复办法飞书桌面端闪退问题 飞书程序错误修复办法

    飞书桌面端闪退多由兼容性、缓存或系统冲突引起,可依次尝试:设置兼容模式运行、更新或重装最新版飞书、回退系统更新;清除AppData路径下的缓存文件;以管理员身份运行sfc和DISM命令修复系统文件;关闭安全软件测试并添加飞书白名单;检查隐私权限设置。按顺序排查基本可解决。 飞书桌面端闪退确实挺烦人,…

    2026年9月27日 • 用户投稿
    000
  • 夸克会员有什么用_夸克会员权益与功能详解

    夸克会员有什么用_夸克会员权益与功能详解夸克会员有什么用_夸克会员权益与功能详解夸克会员有什么用_夸克会员权益与功能详解夸克会员有什么用_夸克会员权益与功能详解

    夸克SVIP会员提供6TB云存储、下载速率高达50MB/s、多格式在线预览、智能剪贴板捕获、自动备份手机相册与聊天记录、回收站保留60天及批量文件管理功能,全面提升使用体验。 如果您在使用夸克时发现部分文件下载缓慢、存储空间不足或无法访问某些高级功能,这可能是因为您尚未开通会员服务。以下是关于夸克会…

    2026年9月27日 • 用户投稿
    100
  • 在抖音的小程序中,如何取消订单?简单操作指南

    在抖音的小程序中,如何取消订单?简单操作指南在抖音的小程序中,如何取消订单?简单操作指南在抖音的小程序中,如何取消订单?简单操作指南在抖音的小程序中,如何取消订单?简单操作指南

    抖音小程序为用户带来了流畅的购物体验,但有时因各种原因您可能需要取消已下单的商品。本文将为您详细介绍如何快速、顺利地完成订单取消流程。 登录抖音小程序 请先打开抖音APP,进入对应的小程序页面,并确保已使用您的账号成功登录,以便查看个人订单信息。 查找目标订单 进入“我的订单”页面: 在小程序首页,…

    2026年9月27日 • 用户投稿
    000
  • windows怎么设置从u盘启动_设置U盘为第一启动项教程

    windows怎么设置从u盘启动_设置U盘为第一启动项教程windows怎么设置从u盘启动_设置U盘为第一启动项教程windows怎么设置从u盘启动_设置U盘为第一启动项教程windows怎么设置从u盘启动_设置U盘为第一启动项教程

    首先调整BIOS/UEFI启动顺序,将U盘设为第一启动项,具体步骤包括进入设置界面、切换至启动选项卡、识别并上移U盘设备、保存配置后重启,或通过快捷键临时选择U盘启动。 如果您需要在Windows电脑上安装操作系统或进行系统维护,但计算机默认从硬盘启动导致无法进入U盘引导界面,您需要调整BIOS/U…

    2026年9月27日 • 用户投稿
    000
  • DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议

    DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议

    deepseek和chatgpt的主要区别在于训练数据、模型架构、擅长领域及应用场景。1. deepseek侧重代码生成与数学推理,适合编程及逻辑任务;2. chatgpt擅长自然语言处理与文本生成,适用于对话、写作等场景;3. 选型应根据项目核心需求决定,若重代码理解选deepseek,若重语言表…

    2026年9月27日 • 用户投稿
    000
  • sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置

    sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置

    Sublime Text 能自动恢复上次打开的文件和布局,需确保设置正确。首先在 Preferences → Settings 用户配置中添加 “remember_open_files”: true 和 “hot_exit”: false,前者保证恢复…

    2026年9月27日 • 用户投稿
    000
  • 从一副牌中抽取唯一牌的正确方法(Java)

    从一副牌中抽取唯一牌的正确方法(Java)从一副牌中抽取唯一牌的正确方法(Java)从一副牌中抽取唯一牌的正确方法(Java)从一副牌中抽取唯一牌的正确方法(Java)

    本文旨在解决在Java中使用递归函数从一副牌中抽取唯一牌时出现的java.lang.StackOverflowError问题。通过分析错误原因,提供正确的代码示例,并详细解释了如何避免该错误,确保每次抽取的牌都是唯一的。本文将帮助读者理解递归的正确使用方式以及如何优化代码以提高效率。 问题分析 原始…

    2026年9月27日 • 用户投稿
    000
  • Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径

    Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径

    首先通过“文件”App的iCloud云盘中“下载”文件夹查找Safari下载内容,其次可在Safari浏览器内点击页面设置按钮查看下载记录,最后进入设置App修改Safari默认下载位置以实现灵活管理。 如果您在使用Safari浏览器下载文件后无法找到其存储位置,可能是由于系统默认将文件保存至特定目…

    2026年9月27日 • 用户投稿
    100
  • 规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!

    规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!

    国庆长假即将到来,最近南方的小伙伴们肯定还无心假期,都在忐忑等待全球最强台风“桦加沙”的到来。目前广东多地都因台风过境而宣布实时“五停”,大家台风天气记得做好防护,不出门不上路,保障人身安全。为了便于让广大居民在家了解台风情况,华为手机负一屏已上线台风动态卡片功能,用户桌面右滑可以快速查看台风等级、…

    2026年9月27日 • 用户投稿
    100
  • 如何免费查询抖音店铺名字大全?推荐技巧

    如何免费查询抖音店铺名字大全?推荐技巧如何免费查询抖音店铺名字大全?推荐技巧如何免费查询抖音店铺名字大全?推荐技巧如何免费查询抖音店铺名字大全?推荐技巧

    想要免费获取抖音店铺名字灵感并掌握高效查询技巧,不妨参考以下实用方法: 1. 善用抖音内置搜索 抖音平台本身就是一个巨大的命名灵感库。只需几步即可挖掘热门名称: 打开抖音App,点击顶部搜索栏。输入行业关键词,如“女装店”、“奶茶店”、“手作饰品”等。浏览搜索结果中的账号昵称与店铺名,筛选出风格契合…

    2026年9月27日 • 用户投稿
    100
  • edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法

    edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法

    首先删除注册表中HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下的Edge策略项,再通过gpedit.msc禁用组策略设置,接着重置Edge浏览器,排查卸载第三方管理软件,最后手动清除Local State文件中的管理配置。 如果您在使用 Microsoft Edge 浏览…

    2026年9月27日 • 用户投稿
    000
  • VSCode如何优化文件搜索速度 VSCode全局搜索的性能优化建议

    vscode文件搜索慢的核心原因是未合理排除无关文件及系统环境限制,解决方法是一套组合拳:1. 配置search.exclude在settings.json中排除node_modules、dist等无关文件夹;2. 确保使用.gitignore并开启search.useignorefiles;3. …

    2026年9月27日
    000
  • 【Linux/C++】Linux下C++命令行编译示例

    本文是关于c++++编程语言基础和linux系统操作基础的系列文章的第二部分。我们将详细介绍在linux环境下如何编译c++代码,并展示相关的编译示例和技巧。 文章目录 准备源代码编译实战引入目录进行编译使用-Wall、-std 参数进行编译生成库文件链接静态库生成可执行文件链接动态库生成可执行文件…

    2026年9月27日
    100
  • Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南

    Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南

    gemini移动端节省流量的核心方法包括:1.开启应用内的数据压缩模式,选择低分辨率加载图片和视频;2.关闭自动播放功能,防止后台流量浪费;3.限制或关闭后台刷新与预加载,减少无谓的数据更新;4.定期清理缓存或设置缓存上限,避免过期数据重复下载;5.启用系统级低数据模式,限制后台流量使用;6.关闭g…

    2026年9月27日 • 用户投稿
    100
  • 星巴克点单抖音怎么弄的?快速了解方法与实用技巧

    星巴克点单抖音怎么弄的?快速了解方法与实用技巧星巴克点单抖音怎么弄的?快速了解方法与实用技巧星巴克点单抖音怎么弄的?快速了解方法与实用技巧星巴克点单抖音怎么弄的?快速了解方法与实用技巧

    引言: 在移动互联网高速发展的今天,抖音已成为大众记录生活、分享日常的重要社交平台。不少用户开始关注:是否可以直接在抖音上点星巴克咖啡?答案是肯定的!本文将为您详细介绍如何通过抖音轻松完成星巴克点单,并提供实用操作技巧与相关知识,助您畅享便捷又有趣的消费体验。 一、星巴克为何选择抖音点单?背后趋势解…

    2026年9月27日 • 用户投稿
    000
  • 设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体

    设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体

    Apache FOP在不同操作系统下配置字体时,使用绝对路径会遇到兼容性问题。本文详细介绍如何在fop.xconf中利用标签和相对embed-url属性,灵活指定字体文件的相对路径,确保应用程序在多种环境中都能正确加载和渲染字体,避免硬编码路径,提升可移植性。 FOP字体配置的跨平台挑战 在使用ap…

    2026年9月27日 • 用户投稿
    500
  • qq浏览器如何删除历史访问记录 QQ浏览器单条与批量删除历史记录教程

    qq浏览器如何删除历史访问记录 QQ浏览器单条与批量删除历史记录教程qq浏览器如何删除历史访问记录 QQ浏览器单条与批量删除历史记录教程qq浏览器如何删除历史访问记录 QQ浏览器单条与批量删除历史记录教程qq浏览器如何删除历史访问记录 QQ浏览器单条与批量删除历史记录教程

    首先打开QQ浏览器,进入“我的”页面点击“历史记录”。若要删除单条记录,长按目标条目后点击删除并确认;若需批量删除,点击“管理”勾选多个条目后选择“删除所选”并确认;如要清空全部历史,点击右下角“清空”按钮,勾选“同时清空全部历史记录”后确认即可完成操作。 如果您在使用QQ浏览器时希望管理您的浏览历…

    2026年9月27日 • 用户投稿
    600
  • 库迪咖啡的抖音优惠券:小程序核销操作步骤

    库迪咖啡的抖音优惠券:小程序核销操作步骤库迪咖啡的抖音优惠券:小程序核销操作步骤库迪咖啡的抖音优惠券:小程序核销操作步骤库迪咖啡的抖音优惠券:小程序核销操作步骤

    如今,抖音已成为社交平台中的热门应用,而库迪咖啡作为深受大众喜爱的连锁咖啡品牌,近期在抖音上线了多项吸引人的优惠券活动,引发众多咖啡爱好者争相参与。如果你也想获取并使用这些超值福利,却还不清楚具体如何操作,接下来将为你详细解析通过抖音小程序领取及核销优惠券的完整流程。 1. 启动抖音App 请确认你…

    2026年9月27日 • 用户投稿
    100
  • 怎样让 AI 模型持续改进工具与豆包配合进行改进?全流程指南​

    怎样让 AI 模型持续改进工具与豆包配合进行改进?全流程指南​怎样让 AI 模型持续改进工具与豆包配合进行改进?全流程指南​怎样让 AI 模型持续改进工具与豆包配合进行改进?全流程指南​怎样让 AI 模型持续改进工具与豆包配合进行改进?全流程指南​

    要让ai模型与豆包配合更好,需通过持续反馈、调优和迭代实现。1. 明确使用场景并设定目标,记录问题并打标签以指导优化方向;2. 善用豆包反馈机制,具体描述问题并定期分析反馈记录;3. 进阶用户可结合结构化外部数据进行微调并通过a/b测试验证效果;4. 优化提示词设计,明确角色、格式和逻辑顺序,提升交…

    2026年9月27日 • 用户投稿
    000
  • 高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单

    高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单

    在骁龙峰会2025上,高通高级副总裁don mcguire表示,最新调研显示,84%的消费者认为搭载骁龙处理器的笔记本表现出色,具备强大性能;同时,95%的用户愿意为配备骁龙移动平台的高端智能手机支付更高价格。 据CNMO了解,骁龙品牌在多个市场已展现出强劲影响力。根据CyberMedia Rese…

    2026年9月27日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信