当前位置: 首页 > 知识库问答 >
问题:

前端 - jQuery 请求失败自动重试逻辑?

公冶森
2023-12-18

碰到一个问题是这样的,有个老项目,用的jquery进行发送请求,因为环境网络不稳定之类的,会有偶然性的请求失败,SSL连接失败,没有状态码,只要重新发送就能正常了。所以期望能做到如果请求响应失败,且没有状态码时,请求能否每隔半秒自动重试3次。如下代码,在重试期间fail、error、always等回调逻辑不会被触发。

$.ajax({    url: 'http://localhost:3000/custom-response',    success: () => console.log('cb,success'),    fail: () => console.log('cb,fail'),    error: () => console.log('cb,error')}).always(    () => console.log('chain,always')).done(() => {    () => console.log('chain,done')}).error(() => {    () => console.log('chain,done')})

试过使用 $.ajaxPrefilter 和 $.ajaxSetup 对error、fail等进行重写,看似成功了一半,可是always没法被覆盖。jquery源码逻辑太长没看太懂,不知道从何改起。不知道有没已有的方案

共有2个答案

龙兴学
2023-12-18

可以看看这个项目

https://github.com/unjs/ofetch#%EF%B8%8F-auto-retry
薛经艺
2023-12-18

你的问题确实很有挑战性,因为 jQuery 的 $.ajax 请求默认情况下并没有提供自动重试的机制。不过,你可以通过组合使用 setTimeout$.ajax 的方式来实现自动重试。以下是一个简单的实现示例:

function retryRequest(options, retriesLeft) {    // 如果 retriesLeft 小于 0,则不再重试    if (retriesLeft < 0) {        if (options.error) {            options.error(jqXHR, textStatus, errorThrown);        }        return;    }    // 发送 AJAX 请求    $.ajax(options)        .done(function() {            // 请求成功,无需重试            retryRequest(options, -1);        })        .fail(function(jqXHR, textStatus, errorThrown) {            // 请求失败,稍后重试            var statusCode = jqXHR.status;            if (statusCode && statusCode !== 0) {                // 如果请求返回了状态码,则可能不是网络问题,停止重试                retryRequest(options, -1);            } else {                // 请求失败且没有状态码,稍后重试                retryRequest(options, retriesLeft - 1);                // 重试间隔为半秒                setTimeout(function() {                    retryRequest(options, retriesLeft - 1);                }, 500);            }        });}// 使用示例retryRequest($.ajax({    url: 'http://localhost:3000/custom-response',    success: () => console.log('cb,success'),    error: () => console.log('cb,error')}), 3); // 最多重试3次

在这个示例中,retryRequest 函数接收两个参数:一个 options 对象和一个 retriesLeft 整数。options 对象包含了 $.ajax 的配置选项,而 retriesLeft 表示剩余的重试次数。如果 retriesLeft 小于 0,则停止重试。如果请求成功,则停止重试。如果请求失败且没有状态码,则稍后重试。每次重试之间等待半秒。

 类似资料:
  • 问题内容: 我已经看到您可以指定如果ajax请求失败通常要做什么,是否可以让它在某种循环中重试,以便它在停止之前尝试至少x次?我以前使用过此代码: 这将适用于所有AJAX请求(如果我输入错了,请纠正我)。 我想做这样的事情: 这行得通吗?甚至更好:这是正确的方法吗?我会将重试包装在计数系统中,以便不会无限重试。在我的应用程序中,十分之九会正常工作,但是我经常与之交互的API之一有时会返回错误。 任

  • 问题内容: IE中的以下AJAX调用失败。 错误函数返回 没有向服务器发出请求,因此我认为JSON没有问题。 已修复,请参阅#1351389 问题答案: 固定,我将content-type从更改为just plain 。 我讨厌IE :) 另外,为了避免IE超级缓存,请尝试以下操作: 这样,每个请求都是IE获得:D的新网址

  • 问题内容: 我正在编写一些重新连接逻辑,以定期尝试建立与发生故障的远程端点的连接。本质上,代码如下所示: 我已经在很多情况下使用类似于上面的代码解决了这个普遍的问题,但是我对结果不满意。是否有设计用于解决此问题的设计模式? 问题答案: 值得结帐的一个库是Sarge,它会根据已定义的计划自动执行重试。

  • 鸿蒙arkts 请求失败了 mock 请求地址:https://dummyjson.com/quotes axios 发起请求 官网Http库

  • 这一条给出: 这个: 我想做的是避免为所有测试编写完整的jsons,如果我可以跳过所有“”和{},将会更快。我的方法正确吗?

  • 我对Docker很陌生,尝试用普通html构建Docker图像,但我有一条错误消息,说用前端dockerfile解决问题失败。v0:无法读取dockerfile:open/var/lib/docker/tmp/buildkit-mount602954594/dockerfile:没有这样的文件或目录 我的文件夹目录如下 在Dockerfile里面,我有 我做了我的命令docker构建。在目录C:\