在跨域请求中捕获 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

Jsonp实现跨域原理

原生js实现简单JSONP

vue 跨域请求 怎么带上cookies

Jquery $.ajax 在跨域调用的 IE 中失败

CORS - 没有 JSONP 的跨域 AJAX 通过允许服务器上的 Origin

请求接口时跨域问题,前端解决方法