在跨域请求中捕获 JSONP 错误
Posted
技术标签:
【中文标题】在跨域请求中捕获 JSONP 错误【英文标题】:Catching a JSONP error on a cross-domain request 【发布时间】:2011-06-22 21:43:41 【问题描述】:我在可能不存在的 URL(不同域)上使用 jQuery.getJSON()
。有没有办法让我捕捉到错误“加载资源失败”?由于此调用的异步性质,try/catch 似乎不起作用。
我也不能使用jQuery.ajax()
的“error:
”。来自文档:
注意:跨域脚本和 JSONP 请求不会调用此处理程序。
【问题讨论】:
请确认:错误可能不是抛出本身,而只是出现在控制台中(仅当您打开控制台时)。 我在 Chrome 控制台打开时看到它,或者在其他浏览器中看到它。关闭开发人员工具后,此错误不会出现。它正在形成 a) 没有办法阻止它和 b) 我不应该担心它? 【参考方案1】:如果您知道从远程服务返回成功结果的最坏情况延迟,您可以使用超时机制来确定是否有错误。
var cbSuccess = false;
$.ajax(
url: 'http://example.com/.../service.php?callback=?',
type: 'get',
dataType: 'json',
success: function(data)
cbSuccess = true;
);
setTimeout(function()
if(!cbSuccess) alert("failed");
, 2000); // assuming 2sec is the max wait time for results
【讨论】:
感谢您的回复。这仍然会引发“加载资源失败”错误,这是我试图停止的事情。 @Matthew Simoneau:该错误被记录,而不是抛出。您无法阻止该错误被记录到控制台中。 Matthew,错误是由浏览器/firebug 层抛出的,所以我不确定你是否可以捕获并停止这种东西。也许某种方式可以与 firebug js 连接?【参考方案2】:这行得通:
j.ajaxSetup(
"error":function(xhr, ajaxOptions, thrownError)
console.log(thrownError);
);
【讨论】:
你确定吗?跨域/JSONP 调用不使用 XHR,它们使用脚本注入。 (至少在这种情况下不考虑 CORS。)【参考方案3】:延迟对象(jQuery 1.5 中的新功能)听起来正是您正在寻找的:
jQuery.Deferred 在 1.5 版本中引入,是一个可链接的实用程序对象,可以将多个回调注册到回调队列中,调用回调队列,并中继任何同步或异步函数的成功或失败状态。
http://api.jquery.com/category/deferred-object/
编辑:
以下代码对我来说很好用:
function jsonError()
$("#test").text("error");
$.getJSON("json.php",function(data)
$("#test").text(data.a);
).fail(jsonError);
json.php 看起来像这样:
print '"a":"1"';
如果 json.php 的路径不正确或 JSON 格式错误,则会触发错误函数。例如:
print 'xxx"a":"1"';
【讨论】:
不完全。延迟是一种用于同步异步操作结果的通用机制。 OP 的问题在于检测 JSONP 请求是否失败。 这看起来很有希望。我对此不熟悉,可能做错了,但这似乎不起作用:$.getJSON("bogus.com/&callback=?").fail(function() ); 布莱恩,谢谢你看这个。我正在处理对可能不存在的 URL 的跨站点 JSONP 请求。这种技术仍然会引发此错误。我开始相信这是不可能停止的,但我可以放心地忽略它,因为它只出现在浏览器的开发者模式中。 我没有意识到您正在使用 JSONP(尽管有所有参考资料:/)。是的,那个控制台错误似乎是无与伦比的,但我也不担心。然而,在我的测试中,jQuery 1.5 似乎会为失败的 JSONP 请求触发错误处理程序。也看看这篇文章:***.com/questions/1002367/…【参考方案4】:您抱怨的是客户端错误,提示您尝试从服务器下载资源。
这是内置在浏览器中的,它允许您的浏览器告诉客户端或开发人员从 Internet 下载资源失败。这与 javascript 无关,是浏览器捕获的 HTTP 上抛出的更底层的错误。
如果您希望抓住它,您将需要放弃第 3 方 ajax 库并在低得多的级别上处理 XMLHTTPRequest
对象,即便如此我怀疑您对此无能为力。
基本上,当您看到此错误时,请找出您尝试获取的不存在或无法访问的对象。然后要么停止访问它,要么使其可访问。
【讨论】:
前两段很棒。第三是完全错误的。 JSONP 是另一种动物。但是使用常规的 .ajax 内容,您可以使用延迟对象来处理错误,这比直接使用 XMLHTTPRequest 更优雅。 @rpflo meh XMLHttpRequest 比.ajax
和延迟更优雅。但是,请给我一个示例,您可以在其中使用 jQuery 捕获此“错误”。以上是关于在跨域请求中捕获 JSONP 错误的主要内容,如果未能解决你的问题,请参考以下文章