为 ajax (jQuery) 设置超时

IT技术 javascript jquery html css ajax
2021-02-04 05:21:31
$.ajax({
    url: "test.html",
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

有时success功能运作良好,有时则不然。

如何为这个ajax请求设置超时?例如,3 秒,如果超时,则显示错误。

问题是,ajax 请求会冻结块直到完成。如果服务器宕机了一段时间,它永远不会结束。

6个回答

请阅读$.ajax 文档,这是一个涵盖的主题。

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

您可以通过访问error: function(jqXHR, textStatus, errorThrown)选项的 textStatus 参数来查看抛出的错误类型选项是“超时”、“错误”、“中止”和“解析器错误”。

确保用 try/catch 包装整个 $.ajax 调用。中止不会被 jQuery 捕获,并且会在 $.ajax 调用之外抛出。
2021-03-17 05:21:31
2021-03-28 05:21:31
只是似乎对我不起作用,超时:1,确认它正在通过,只是永远不会超时
2021-04-11 05:21:31

下面是一些示例,演示了在 jQuery 的新旧范式中设置和检测超时。

Live Demo

使用 jQuery 1.8+ 的Promise

Promise.resolve(
  $.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
  })
).then(function(){
  //do something
}).catch(function(e) {
  if(e.statusText == 'timeout')
  {     
    alert('Native Promise: Failed from timeout'); 
    //do something. Try again perhaps?
  }
});

jQuery 1.8+

$.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
}).done(function(){
    //do something
}).fail(function(jqXHR, textStatus){
    if(textStatus === 'timeout')
    {     
        alert('Failed from timeout'); 
        //do something. Try again perhaps?
    }
});​

jQuery <= 1.7.2

$.ajax({
    url: '/getData',
    error: function(jqXHR, textStatus){
        if(textStatus === 'timeout')
        {     
             alert('Failed from timeout');         
            //do something. Try again perhaps?
        }
    },
    success: function(){
        //do something
    },
    timeout:3000 //3 second timeout
});

请注意,textStatus参数(或jqXHR.statusText)会让您知道错误是什么。如果您想知道失败是由超时引起的,这可能很有用。

错误(jqXHR,textStatus,errorThrown)

请求失败时调用的函数。该函数接收三个参数:jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象、描述发生的错误类型的字符串和可选的异常对象(如果发生)。第二个参数(除了 null)的可能值是“超时”、“错误”、“中止”和“解析器错误”。当发生 HTTP 错误时,errorThrown 接收 HTTP 状态的文本部分,例如“未找到”或“内部服务器错误”。从 jQuery 1.5 开始,错误设置可以接受函数数组。每个函数都会被依次调用。注意:跨域脚本和 JSONP 请求不会调用此处理程序。

源代码:http : //api.jquery.com/jQuery.ajax/

@GarciaWebDev - 请参阅调用 jquery ajax - .fail 与 :error
2021-03-15 05:21:31
什么之间的区别$.ajax().fail()$.ajax().error()
2021-03-30 05:21:31
+1 包括 jQuery 1.8+。对类似问题的大多数其他答案仅包括来自 < 的成功/错误。
2021-04-10 05:21:31

您可以使用timeoutajax 选项中设置,如下所示:

$.ajax({
    url: "test.html",
    timeout: 3000,
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

在此处阅读有关 ajax 选项的所有信息:http : //api.jquery.com/jQuery.ajax/

请记住,当超时发生时,将error触发处理程序而不是success处理程序:)

使用全功能的.ajaxjQuery 函数。https://stackoverflow.com/a/3543713/1689451为例进行比较

无需测试,只需将您的代码与引用的 SO 问题合并:

target = $(this).attr('data-target');

$.ajax({
    url: $(this).attr('href'),
    type: "GET",
    timeout: 2000,
    success: function(response) { $(target).modal({
        show: true
    }); },
    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            alert(t);
        }
    }
});​
我怎么做通过 .load() ?有可能吗?
2021-03-19 05:21:31
H-Bahrami 和 Rudolf Mühlbauer 感谢您的回复,但我是 ajax 新手,所以请通过我的代码澄清...因为我已经看到这些答案,但我不知道发生了什么......所以请帮助我......
2021-04-07 05:21:31
@SS,尝试在加载文档中查找超时:api.jquery.com/load - 我的代码中有一个错字,已更正。
2021-04-09 05:21:31

如果您的请求通过 NginX,也不要忘记检查 NginX 设置。

Ajaxoptions.timeout是一回事,但 nginx 请求超时可能也需要调整。

https://ubiq.co/tech-blog/increase-request-timeout-nginx/