JSONP请求error handling

我正在做ajax jsonp请求,但失败error handling将无法正常工作。 如果请求是404或500,则不会处理该错误。

我一直在四处寻找答案,但找不到任何东西。 似乎有一个与http://code.google.com/p/jquery-jsonp/解决scheme,但我找不到如何使用它的任何示例。

function authenticate(user, pass) { $.ajax ({ type: "POST", url: "url", dataType: 'jsonp', async: false, //json object to sent to the authentication url data: {"u": userid, "p": pass}, success: function (data) { //successful authentication here console.log(data); }, error: function(XHR, textStatus, errorThrown) { alert("error: " + textStatus); alert("error: " + errorThrown); } }) } 

两种方式来处理错误,

  1. 跨域JSONP请求没有error handling。 使用Github上提供的jsonp插件https://github.com/jaubourg/jquery-jsonp提供error handling支持。

  2. jQuery ajax Timeout – 经过一段合理的时间后发生错误callback的超时,因为它可能已经失败了。 您可能不知道实际的错误(或错误状态)是什么,但至less您可以处理错误

如果你检查jQuery.ajax()文档 ,你可以find:

错误

如果请求失败,则调用该函数(…) 注意 :此处理程序针对跨域脚本和跨域JSONP请求调用。 这是一个Ajax事件。

正因为如此,你不得不find解决办法。 您可以指定超时来触发错误callback。 这意味着在规定的时间内,请求应该顺利完成。 否则,假定它失败了:

 $.ajax({ ... timeout: 5000, // a lot of time for the request to be successfully completed ... error: function(x, t, m) { if(t==="timeout") { // something went wrong (handle it) } } }); 

你的代码中的其他问题…

虽然JSONP (看这里和这里 )可以用来克服源策略的限制,但是你不能使用JSONP进行POST(请参阅CORS ),因为它不会以这种方式工作 – 它创build一个元素来获取数据,它必须通过GET请求完成。 JSONP解决scheme不使用XmlHttpRequest对象,所以它不是标准的理解方式中的AJAX请求,但内容仍然是dynamic访问的 – 对于最终用户来说没有区别。

 $.ajax({ url: url, type: "GET" dataType: "jsonp", ... 

其次,您提供的数据不正确。 您将JavaScript对象(使用对象字面值创build)推送到线上,而不是其序列化的JSON表示。 创buildJSONstring(不是手动的,使用例如JSON.stringify转换器):

 $.ajax({ ... data: JSON.stringify({u: userid, p: pass}), ... 

最后一个问题,你已经设置asyncfalse ,而文档说:

跨域请求和dataType:“jsonp”请求不支持同步操作。

我一直在努力像你一会儿试图处理Ajax jsonp DataType请求上的错误,但是我想分享你我的代码,希望它有帮助。 一个基本的事情是在ajax请求中包含超时,否则它将永远不会input错误:函数

 $.ajax({ url: "google.com/api/doesnotexists", dataType: "jsonp", timeout: 5000, success: function (parsed_json) { console.log(parsed_json); }, error: function (parsedjson, textStatus, errorThrown) { console.log("parsedJson: " + JSON.stringify(parsedjson)); $('body').append( "parsedJson status: " + parsedjson.status + '</br>' + "errorStatus: " + textStatus + '</br>' + "errorThrown: " + errorThrown); } }); 

jsfiddle – 处理jquery ajax调用和JSONP数据types的错误 – 错误404

我正在构build一个使用jquery-jsonp的脆弱的JS项目,并提出了一个双jsonp / ajax方法来处理错误,无论哪种方法最终被使用。

 function authenticate(user, pass) { var ajax = ($.jsonp || $.ajax)({ 'url': /* your auth url */, 'data': { /* user, pass, ... */ }, 'contentType': "application/javascript", 'dataType': 'jsonp', 'callbackParameter': 'callback' // $.jsonp only; $.ajax uses 'jsonpCallback' }); ajax.done(function (data) { // your success events }); ajax.fail(function (jqXHR, textStatus, errorThrown) { // $.jsonp calls this func as function (jqXHR, textStatus) // and $.ajax calls this func with the given signature console.error('AJAX / JSONP ' + textStatus + ': ' + (errorThrown || jqXHR.url)); }); } 

由于jquery-jsonp和$ .ajax都支持jQuery Deferred规范,所以我们可以将两个error handling程序合并在一起,处理400和500系列错误以及查找超时。

老问题,但我有同样的问题。 这是一个为我工作的解决scheme。

如果您拥有自己的域名,那么您可以在响应中设置一个variables,并在客户端检查它。

服务器端:

 SERVER_RESPONSE=true; Callback(parameter1, parameter2); 

客户端:

 if(typeof SERVER_RESPONSE === 'undefined'){ console.log('No Response, maybe server is down'); } else{ console.log('Got a server response'); }