【问题标题】:jQuery: Missing 'timeout' error, error callback does not firejQuery:缺少“超时”错误,错误回调不会触发
【发布时间】:2017-12-08 11:26:43
【问题描述】:

在进行注册时,我想立即检查电子邮件地址是否已与帐户关联。 因此,我使用 jQuery Validation Plugin 并向服务器发送同步 ajax 请求。效果很好。
为了测试在超时的情况下会发生什么,我为 ajax 请求选择了 5 毫秒的超时。在服务器端(php 文件)程序执行使用 sleep(5) 延迟 5 秒。
但是成功回调不是在 5 毫秒后收到超时错误,而是在 5 秒后从服务器返回正确的数据。
所以ajax超时参数似乎不起作用。 这是我的代码:

    $.validator.addMethod('ist_ProvEmail_noch_frei',function(value, element) {
    var bValidEmail;

    var jqXHR = $.ajax({
        url:  'ajax/IstProvEmailVergeben.php',
        data: {
            email:  value
        },
        success : function(data, textStatus, jqXHR) { 
            console.log("success1: " + textStatus);
      // some code
        },
        error : function(jqXHR, textStatus, errorThrown) {  
            console.log("textStatus1: " + textStatus + ", type: " + typeof textStatus );
      // some code
            bValidEmail = true; // to prevent jQueryValidation from showing an error message
        },

        method: "POST",
        async:  false,  
        timeout: 5,         // 5 ms 
        dataType: 'json'
    });

    console.log("jqXHR.responseText: " + jqXHR.responseText);
    return bValidEmail;
}, 'This email address is already associated with an account.');

我已经用其他文章检查了几次代码,但无法找出问题所在。
有人有想法吗?

亨利

【问题讨论】:

  • 只能认为超时不适用于async: false,尽管这不是记录的功能。试试async: true
  • 无论如何,你都应该使用async: true
  • 我必须使用异步:false。否则 jQueryValidate 插件不会得到正确的答案,即 bValidEmail 取决于来自服务器的信息。异步请求返回未定义的 bValidEmail。
  • 你必须解决这个问题。总有办法。
  • 与其编写自己的自定义方法,不如使用插件中已经内置的remote 方法?

标签: jquery ajax timeout jquery-validate


【解决方案1】:

async: false 是你的问题。使用异步调用查看此处:

$.ajax({
    url: "/ajax_json_echo/",
    type: "GET",
    dataType: "json",
    timeout: 5,
    success: function(response) { alert("success"); },
    error: function(xmlhttprequest, textstatus, message) {
        if(textstatus==="timeout") {
            alert("got timeout");
        } else {
            alert(textstatus);
        }
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

这里是 async: false:

$.ajax({
    url: "/ajax_json_echo/",
    type: "GET",
    dataType: "json",
    timeout: 5,
    async:  false,
    success: function(response) { alert("success"); },
    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            console.log(t);
        }
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

原因:在同步ajax请求时,浏览器被阻塞,浏览器被阻塞时无法执行javascript。

编辑:使用超时和同步请求的解决方法:https://stackoverflow.com/a/36008375/1670090

$.ajax({
    url : '/ajax_json_echo/',
    type: 'GET',
    timeout: 5,
    dataType : 'json',
    success : function(data, textStatus) {
        $.ajax({
            url : '/ajax_json_echo/',
            async: false,
            type: 'GET',
            dataType : 'json',
            success: function(response) { alert("success"); },
            error: function(xmlhttprequest, textstatus, message) {
                if(textstatus==="timeout") {
                    alert("got timeout");
                } else {
                    alert(textstatus);
                }
            }
        });
    },
    error : function(jqhdr, textstatus,
                     errorThrown) {
        if(textstatus==="timeout") {
            alert("got timeout");
        } else {
            alert(textstatus);
        }
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • “解决方法”应在您的答案中完整说明。您永远不应该发布指向另一个 SO 答案的链接作为答案。
  • 感谢@Sparky,我已经添加了与 OP 问题相关的代码。
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 2012-04-23
  • 2018-12-23
  • 2016-03-25
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多