超时无法在ajax post请求中工作

byJ*_*van 7 javascript ajax jquery html5

我无法在3秒后制作ajax错误回调函数.我尝试了超时,但在指定的时间后它不会切换到错误回调!我无法得到警报Got timeout.

当我在这个网站上提到类似问题的类似问题时,它没有帮助.它们都使用ajax GET类型.我正在使用jquery 1.10.1库.

脚本:

$.ajax({
  type: 'POST',
  timeout: 3000,
  url : "http://mydomain/Services.asmx/Best_Scores",
  dataType: "text",
  async:false,
  crossDomain:true,
  data: "strJsonRequest="+scoredata,
  success: function (data) {
    // Success code ...
  },
  error: function (data, textStatus, errorThrown) {
    if(textStatus == "timeout") {
      alert("Got timeout");
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

有解决方案吗

byJ*_*van 14

修复:

更改async : false到async: true

原因:

同步AJAX调用将阻塞,直到请求完成.由于技术原因,无法实现超时,因为以后必须执行AJAX调用.

如果稍后执行AJAX调用,该函数必须以某种方式实现阻塞功能,以阻止代码在AJAX调用后进​​一步运行,并在超时后再次执行 - 不可能.


小智 5

今天(2019年)我仍然遇到这个问题。

我的 ajax 调用太长(取决于日期开始->日期结束)php 脚本。

几分钟后,我收到错误 500,async: true 没有帮助。

通话内容是:

$.ajax({
    type: "GET",
    dataType: 'json',
    url: 'mymscript.php',
    contentType:'application/json;charset=UTF-8;',
    data: $('[name="myForm"]').serialize(),
    async:true,
    timeout:0,
success: function(response){
...
Run Code Online (Sandbox Code Playgroud)

我解决了使用:side PHP:

set_time_limit(0);
ignore_user_abort(true);
Run Code Online (Sandbox Code Playgroud)

在脚本的开头。

echo ' ';
flush();
ob_flush();
Run Code Online (Sandbox Code Playgroud)

在脚本的中间(例如每天在主循环中)。这有助于让客户端不要断开连接(我认为这是主要问题)。

使用这个我不断地在最终的 json 之前写入空格。幸运的是jquery在解析json之前修剪了空格,最终json是有效的。

因此,我可以捕获响应对象来了解脚本是否因错误或警告而结束。

我希望这对某人有帮助。