jQuery ajax错误功能


130

我有一个ajax调用,将数据传递到页面,然后返回一个值。

我已经从页面中检索了成功的调用,但是我已经对其进行了编码,以便在ASP中引发错误。如何从jquery中检索该错误?

例如:

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

这是我不理解的错误位。我需要在函数中输入什么参数,以便可以使用错误消息服务器中引发


那里有错别字:dataType不是datatype
亚历杭德罗·纳瓦


7
@ alej27:用词有点奇怪,但是它并没有说您不能同时使用它们,而是说请求不会调用成功和错误(因为它们是互斥的)。
马蒂·万斯

在这里使用的答案照顾在jQuery 3.0弃用注意到.error,并.success成为他们已被删除更重要。
Mark Schultheiss

Answers:


221

Ajax error函数中的必需参数为jqXHR, exception,您可以如下使用它:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

演示场


参量

jqXHR:

它实际上是一个错误对象,看起来像这样

Ajax错误jqXHR对象

您也可以在console.log内部浏览器控制台中使用以下error功能查看此内容:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

我们正在使用status该对象的属性来获取错误代码,例如,如果我们获取status = 404,则意味着找不到请求的页面。它根本不存在。根据状态代码,我们可以将用户重定向到登录页面或我们的业务逻辑要求。

例外:

这是显示异常类型的字符串变量。因此,如果我们遇到404错误,则exception文本将仅仅是“错误”。同样,我们可能会得到“超时”,“中止”作为其他异常文本。


取消通知:jqXHR.success()jqXHR.error()jqXHR.complete()回调弃用的jQuery 1.8。要准备的代码为他们的最终消除,使用jqXHR.done()jqXHR.fail()jqXHR.always()来代替。

因此,如果您使用的是jQuery 1.8或更高版本,我们将需要更新成功和错误函数逻辑,例如:

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

希望能帮助到你!


6
有趣的是,不建议使用ajaxSetup。参见api.jquery.com/jquery.ajaxsetup
SleepyBoBos 2014年

1
@palasн我认为您误读了弃用通知。如果您注意到了,弃用通知是关于jqXHR方法的弃用,但是在上面的示例中,成功,错误和完成的使用是在$ .ajax方法的对象内完成的。此功能尚未弃用,您无需切换代码。但是,如果您喜欢链接方法,则可以使用这种样式。当我阅读“弃用...”时,这让我失望(无缘无故)。:-)
bchr02

在jQuery 3.0弃用注意到.error并且.success,因为他们已被删除变得更加重要
马克Schultheiss

99

试试这个:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

如果您想通知前端有关验证错误,请尝试返回json:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

您的asp脚本应该返回:

{"error": true}

1
textSttaus和errorThrown是做什么用的?能否请您解释
安纳普尔那

4

这是解决asp错误的方法。

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }


2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }

2

你正在使用一个功能

error(error) 

但是jquery实际上正在寻找具有三个参数的函数:

error(jqXHR, textStatus, errorThrown)

您将需要再添加两个参数。

还:请查看上面提到“已弃用”的所有评论:)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});

4
您将需要再添加两个参数 -太错了。
开发人员

1
嗯。如果那只是您要说的-也许什么也没说?或者,您可以解释您的陈述并提供实际帮助。你的选择。
increddibelly

1
在JavaScript中,假设您有一个方法- function myMethod (err) { alert(err); }然后再调用它myMethod ("something is wrong", 500, some_object)-这样就可以正常工作。根据您的声明,这仅在方法签名为时才有效function myMethod (err, status, some_object)。忘记上面的示例,success答案中包含的事件的签名实际上是.success(data, status, xhr),但是如果您只需要结果,则通常将其绑定,.success (data)并且两者均有效。
开发人员

通过添加此答案,您带来了什么增值?IMO,您的答案中没有任何先前答案中所缺少的信息。您所做的只是将问题再次提出来。
开发人员

0

从jquery.com:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

如果需要全局处理程序,可以使用:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.