如何捕获 Ajax 查询发布错误?
Posted
技术标签:
【中文标题】如何捕获 Ajax 查询发布错误?【英文标题】:How do I catch an Ajax query post error? 【发布时间】:2011-02-19 12:12:38 【问题描述】:如果 Ajax 请求失败,我想捕获错误并显示相应的消息。
我的代码如下所示,但我无法捕获失败的 Ajax 请求。
function getAjaxData(id)
$.post("status.ajax.php", deviceId : id, function(data)
var tab1;
if (data.length>0)
tab1 = data;
else
tab1 = "Error in Ajax";
return tab1;
);
我发现,当 Ajax 请求失败时,“Error in Ajax”永远不会执行。
如何处理 Ajax 错误并在失败时显示相应的消息?
【问题讨论】:
【参考方案1】:如果你想使用 .then() which has a subtle difference in comparison with .done() :
return $.post(url, payload)
.then(
function (result, textStatus, jqXHR)
return result;
,
function (jqXHR, textStatus, errorThrown)
return console.error(errorThrown);
);
【讨论】:
【参考方案2】:您将 .onerror 处理程序附加到 ajax 对象,为什么当 vanila 跨平台工作时人们坚持发布 JQuery 以获得响应...
快速示例:
ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function()
alert("Oops! Something went wrong...");
ajax.send(someWebFormToken );
【讨论】:
【参考方案3】:您必须记录 responseText:
$.ajax(
type: 'POST',
url: 'status.ajax.php',
data:
deviceId: id
)
.done(
function (data)
//your code
)
.fail(function (data)
console.log( "Ajax failed: " + data['responseText'] );
)
【讨论】:
【参考方案4】:一个简单的方法是实现ajaxError:
每当 Ajax 请求完成时 出现错误时,jQuery 会触发 ajaxError 事件。任何和所有处理程序 已经注册的 .ajaxError() 方法在执行 这次。
例如:
$('.log').ajaxError(function()
$(this).text('Triggered ajaxError handler.');
);
我建议阅读ajaxError 文档。它所做的不仅仅是上面演示的简单用例 - 主要是它的回调接受许多参数:
$('.log').ajaxError(function(e, xhr, settings, exception)
if (settings.url == 'ajax/missing.html')
$(this).text('Triggered ajaxError handler.');
);
【讨论】:
+1 - 我要补充一点,这个处理程序有几个参数,所以你可以显示实际的错误、响应代码、url等。 请注意,从 jQuery 1.8 开始,.ajaxError() 方法只能附加到文档。【参考方案5】:从 jQuery 1.5 开始,您可以使用延迟对象机制:
$.post('some.php', name: 'John')
.done(function(msg) )
.fail(function(xhr, status, error)
// error handling
);
另一种方法是使用.ajax
:
$.ajax(
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg)
alert( "Data Saved: " + msg );
,
error: function(XMLHttpRequest, textStatus, errorThrown)
alert("some error");
);
【讨论】:
@Yuck $.post 可以接受使用延迟对象的错误回调。请看下面我的答案作为示例。 另外,让$.ajax
更具可读性的方法是为您的data
使用哈希。例如: name : 'John', location: 'Boston'
上述成功和错误回调在 jQuery 1.8 中已过时 api.jquery.com/jQuery.post
@MichaelVeneble 我想你可以使用$.post().error()
【参考方案6】:
$.post('someUri', ,
function(data) doSomeStuff )
.fail(function(error) alert(error.responseJSON) );
【讨论】:
在此处添加更多解释将对未来的读者有所帮助。【参考方案7】:jQuery 1.5 添加了延迟对象,可以很好地处理这个问题。只需调用$.post
并在调用后附加您想要的任何处理程序。延迟对象甚至允许您附加多个成功和错误处理程序。
例子:
$.post('status.ajax.php', deviceId: id)
.done( function(msg) ... )
.fail( function(xhr, textStatus, errorThrown)
alert(xhr.responseText);
);
在 jQuery 1.8 之前,函数 done
被称为 success
和 fail
被称为 error
。
【讨论】:
+1 非常好,但仍然对语法不感兴趣。希望它在未来的版本中得到统一。 这应该是公认的答案。当前接受的答案是“使用不同的方法”;这个答案说“这是使您的方法起作用的方法”。后者通常是 SO 的首选。实际上,这应该包含在 $.post 文档中!!! api.jquery.com/deferred.fail , api.jquery.com/deferred.done 用于文档 顺便还有responseJSON
属性,在ajax类型为json
的情况下也很方便。
xhr.responseText
似乎是失败回调大海捞针中的一根针。但我建议将dataType: 'text'
添加到$.post 的第二个参数。 might 帮助引导不同内容类型的错误消息显示在 responseText 中。但我还没有检查。【参考方案8】:
$.ajax(
type: 'POST',
url: 'status.ajax.php',
data:
deviceId: id
,
success: function(data)
// your code from above
,
error: function(xhr, textStatus, error)
console.log(xhr.statusText);
console.log(textStatus);
console.log(error);
);
【讨论】:
以上是关于如何捕获 Ajax 查询发布错误?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?
使用带有 JSONP 的 AJAX 未捕获的 SyntaxError 和 CORS 错误
如何在 ajax 调用成功中访问 jquery 对象 - 未捕获的错误:SYNTAX_ERR:DOM Exception 12