【问题标题】:Catching a JSONP error on a cross-domain request在跨域请求中捕获 JSONP 错误
【发布时间】:2011-06-22 21:43:41
【问题描述】:

我在可能不存在的 URL(不同域)上使用 jQuery.getJSON()。有没有办法让我捕捉到错误“加载资源失败”?由于此调用的异步性质,try/catch 似乎不起作用。

我也不能使用jQuery.ajax() 的“error:”。来自文档:

注意:跨域脚本和 JSONP 请求不会调用此处理程序。

【问题讨论】:

  • 请确认:错误可能不是抛出本身,而只是出现在控制台中(仅当您打开控制台时)。
  • 我在 Chrome 控制台打开时看到它,或者在其他浏览器中看到它。关闭开发人员工具后,此错误不会出现。它正在形成 a) 没有办法阻止它和 b) 我不应该担心它?

标签: javascript jquery json error-handling jsonp


【解决方案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 请求触发错误处理程序。也看看这篇文章:stackoverflow.com/questions/1002367/…
【解决方案4】:

您抱怨的是客户端错误,提示您尝试从服务器下载资源。

这是内置在浏览器中的,它允许您的浏览器告诉客户端或开发人员从 Internet 下载资源失败。这与 JavaScript 无关,是浏览器捕获的 HTTP 上抛出的更底层的错误。

如果您希望抓住它,您将需要放弃第 3 方 ajax 库并在低得多的级别上处理 XMLHTTPRequest 对象,即便如此我怀疑您对此无能为力。

基本上,当您看到此错误时,请找出您尝试获取的不存在或无法访问的对象。然后要么停止访问它,要么使其可访问。

【讨论】:

  • 前两段很棒。第三是完全错误的。 JSONP 是另一种动物。但是使用常规的 .ajax 内容,您可以使用延迟对象来处理错误,这比直接使用 XMLHTTPRequest 更优雅。
  • @rpflo meh XMLHttpRequest 比 .ajax 和延迟更优雅。但是,请给我一个示例,您可以在其中使用 jQuery 捕获此“错误”。
猜你喜欢
  • 1970-01-01
  • 2012-09-08
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2013-02-24
  • 2019-01-09
  • 2013-11-25
相关资源
最近更新 更多