39

我正在发出 ajax jsonp 请求,但失败错误处理不起作用。如果请求是 404 或 500,它将不会处理错误。

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

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

5 回答 5

53

如果您查看jQuery.ajax() 文档,您可以找到:

错误

请求失败时调用的函数 (...)注意:跨域脚本和跨域 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)
        }
    }

});

您的代码中的其他问题...

虽然JSONP(查看此处此处)可用于克服原始策略限制,但您不能使用 JSONP 发布(请参阅CORS),因为它不能那样工作- 它创建一个元素来获取数据,这必须通过 GET 请求完成。JSONP方案不使用XmlHttpRequest对象,所以不是标准理解方式的AJAX请求,但内容仍然是动态访问的——对最终用户来说没有区别。

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

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

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

最后一期,您已设置asyncfalse,而文档说:

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

于 2013-09-30T18:25:28.297 回答
39

两种处理错误的方法,

  1. 跨域 JSONP 请求没有错误处理。使用 Github https://github.com/jaubourg/jquery-jsonp上提供的 jsonp 插件, 它提供了对错误处理的支持。

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

于 2013-10-06T10:34:20.690 回答
11

一段时间以来,我一直在像您一样努力处理 ajax jsonp DataType 请求的错误,但是我想与您分享我的代码,希望对您有所帮助。一个基本的事情是在ajax请求中包含一个超时,否则它永远不会进入错误:函数

$.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 dataType 处理错误 - 错误 404

于 2013-10-04T16:06:20.560 回答
2

我正在构建一个使用 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 规范,我们可以将两个错误处理程序合并在一起,处理 400 和 500 系列错误,以及查找超时。

于 2013-09-30T20:23:09.680 回答
0

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

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

服务器端:

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');
}
于 2014-05-06T15:12:34.037 回答