Jquery JSONP请求错误处理

Jquery JSONP请求错误处理,jquery,ajax,json,error-handling,jsonp,Jquery,Ajax,Json,Error Handling,Jsonp,我正在发出一个ajax jsonp请求,但是失败错误处理无法工作。如果请求是404或500,则不会处理错误 我一直在四处寻找答案,但什么也找不到。似乎有一个解决方案,但我找不到任何关于如何使用它的例子 function authenticate(user, pass) { $.ajax ({ type: "POST", url: "url", dataType: 'jsonp', async: false,

我正在发出一个ajax jsonp请求,但是失败错误处理无法工作。如果请求是404或500,则不会处理错误

我一直在四处寻找答案,但什么也找不到。似乎有一个解决方案,但我找不到任何关于如何使用它的例子

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);
        }
    })
}
如果您进行检查,您可以找到:

错误

请求失败时调用的函数(…)注意:对于跨域脚本和跨域JSONP请求,不会调用此处理程序。这是一个Ajax事件

正因为如此,你不得不找到解决办法。您可以指定超时以触发错误回调。这意味着在指定的时间范围内,请求应成功完成。否则,假设它失败了:

$.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)
        }
    }

});
代码中的其他问题

虽然(look and)可以用来克服源策略限制,但不能使用JSONP进行POST(请参见),因为它只是创建了一个元素来获取数据,这必须通过GET请求来完成。JSONP解决方案不使用XmlHttpRequest对象,因此它不是理解的标准方式中的AJAX请求,但内容仍然是动态访问的——对最终用户来说没有区别

$.ajax({
    url: url,
    type: "GET"
    dataType: "jsonp",
    ...
其次,您提供的数据不正确。您正在将javascript对象(使用对象文本创建)推送到网络上,而不是其序列化JSON表示。创建JSON字符串(非手动,例如使用
JSON.stringify
converter):

上一期,您已将
async
设置为
false
,而文档说明:

跨域请求和数据类型:“jsonp”请求不支持 同步操作


我正在构建一个脆弱的JS项目,该项目使用jQueryJSONP,并提出了一种双重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延迟规范,我们可以将这两个错误处理程序合并在一起,处理400和500系列错误,以及查找超时。

我和您一样努力处理ajax jsonp数据类型请求的错误,但是我想与您分享我的代码,希望它能有所帮助。最基本的是在ajax请求中包含一个超时,否则它将永远不会进入error:function

$.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);        

 }
});
$.ajax({
url:“google.com/api/doesnotexists”,
数据类型:“jsonp”,
超时:5000,
成功:函数(已解析的_json){
log(已解析的_json);
},
错误:函数(parsedjson、textStatus、errorshown){
log(“parsedJson:+JSON.stringify(parsedJson));
$('body')。追加(
“parsedJson状态:“+parsedJson.status+”
“+ “errorStatus:“+textStatus+”
“+ “ErrorSprown:”+ErrorSprown); } });

处理错误的两种方法

  • 跨域JSONP请求没有错误处理。使用Github上提供的支持错误处理的jsonp插件

  • jQuery ajax Timeout-在触发错误回调的合理时间后超时,因为它可能在静默中失败。您可能不知道实际错误(或错误状态)是什么,但至少您可以处理错误


  • 老问题,但我有同样的问题。这是一个对我有效的解决方案

    如果你拥有你的请求所在的域,你可以在响应中设置一个变量,并在客户端检查它

    服务器端:

    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');
    }
    

    方法2在下面的回答中得到了演示:从这个角度看,它最初似乎是有效的,但不幸的是,使用“google.com/api/doesnotexists”将发出jQuery请求
    http://fiddle.jshell.net/_display/google.com
    ,而不是
    google.com
    。如果您在url前面加上
    http
    ,您将看到正确的行为,其中观察到超时,并且没有返回状态;在这个例子中,请求的URL是错误的。很好的例子,这对我来说很有效,因为一个伪URL而拒绝投票?真正地只想补充一点,上面答案中链接到的AJAX文档也在
    timeout
    参数下声明:
    仅在Firefox 3.0+中,脚本和JSONP请求不能通过超时来取消;即使脚本在超时后到达,脚本也将运行。
    Tim McClure。Tim Mclure所说的是真的,我已经在互联网上搜索了2天多,现在正试图找到一个解决方案来处理“未捕获的类型错误:jQuery10203912213369484832883_193467225不是一个函数”。Try-catch不是捕获它。我用它包装了我的$.ajax调用,但运气不好。
    if(typeof SERVER_RESPONSE === 'undefined'){
      console.log('No Response, maybe server is down');
    }
    else{
      console.log('Got a server response');
    }