jQuery:优雅地处理ajax返回的错误状态码

3

我有一个非常简单的ajax请求:

$.get(url, data)
   .done(function () { })
   .fail(function () { })

如果在url上出现错误,它将返回一个状态码,例如"500"。显然,jQuery在这一点上考虑了jqxhr对象的承诺,因为它将执行.done而不是.fail。我的问题有两个方面:
首先,默认情况下,ajax何时触发.fail?是否有任何方法可以更改此默认设置?
其次,处理坏请求的唯一方法似乎是类似于以下内容的特殊处理:

.done(function (msg, tm, jqxhr) {
   if (jqxhr.status < 200 || jqxhr.status >= 300) performFailure();
});

有没有更好的方法来查找和处理被视为“不良”的响应?

3个回答

0

查看 .ajax 函数的文档,它有一个非常好的错误处理程序:http://api.jquery.com/jQuery.ajax/。您可能希望使用此函数而不是 get()。 (从这个页面可以看出,两者本质上是相同的:http://api.jquery.com/jQuery.get/);

您的代码示例:

     $.ajax({
       url: url,
       data: data,
       error: /*error function*/,
       success: /*success function*/,
     });

这并不改变错误处理;实际上发生的事情是相同的。 - Explosion Pills
当网址返回错误代码时,返回的错误函数看起来像是error(jqXHR, textStatus, errorThrown),它应该包含任何你需要适当处理的信息。 - RestingRobot
问题在于 error(或 .fail())甚至都没有被调用,但这并不是 jQuery 的问题。请看我的答案。 - Explosion Pills
我明白了。你在发帖之前没有检查过HTTP请求对象吗? - RestingRobot
这听起来很愚蠢,但我在一个生产服务器上测试时,从ajax请求中得到了500错误。我在开发服务器上更新了代码以使用.fail(),但它没有起作用;我没有想到两个服务器之间发送的状态码会有所不同。 - Explosion Pills

0

来自 jQuery .get() 文档:

如果使用 jQuery.get() 发送请求返回错误代码,它将会默默失败,除非脚本还调用了全局的 .ajaxError() 方法。或者,从 jQuery 1.5 开始,由 jQuery.get() 返回的 jqXHR 对象也提供了 .error() 方法来处理错误。

(强调是我的)

我对错误处理并不熟悉,但听起来你可能需要调用 ajaxError 来传递错误条件。


.fail.error是jqxhr对象的相同方法,我正在使用它。.done执行(与.success相同),无论状态代码如何。这对我来说似乎是有意的。顺便说一下,我正在使用jQuery 1.7。 - Explosion Pills
我并没有建议使用.error而不是.fail。我是在指出错误代码会悄无声息地失败。请查看我的回答中的斜体文本。您需要让脚本调用.ajaxError()才能进入错误/失败块。 - veeTrain
我看到你在答案中所说的,有时错误条件会被解释为200-OK。你的情况是这样吗?当你决定如何处理错误时,能否更新你的答案? - veeTrain
那时候你唯一能处理错误的方式就是检查输出。 - Explosion Pills

0

经过进一步的调查,似乎jQuery确实正确地使用了.fail()。问题在于我的服务器对某些错误发出了200。换句话说,这本来就不是一个jQuery的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接