当Ajax无法获取JSON时,无法访问错误或失败

时间:2017-02-20 19:40:02

标签: javascript jquery json ajax

我正在使用JavaScript下面的Ajax代码,我试图在URL无法正确加载JSON时弹出一个对话框,原因可能是过期令牌或不正确令牌,无论如何,我期待用于查找错误或失败的代码,但它没有发生。当URL可以成功加载JSON时,正在按预期命中成功和完成块,但是当URL失败时没有任何内容被击中。我曾尝试使用async: false并试图检查一个布尔变量weHaveSuccess,但是代码的最后一行中的console.log(weHaveSuccess);即使在执行成功/错误之前也会执行,在我看来就像它仍然异步加载一样。我想知道为什么当URL中的JSON加载失败时,没有命中错误块。

我的代码

function checkUser(myURL, newAccessToken, weHaveSuccess) {

    $.ajax({

        type: "GET",

        dataType: "jsonp",

        async: false,

        url: myURL + newAccessToken,

        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("Status: " + textStatus);
            console.log("Error: " + errorThrown);
        },

        success: function (data) {

            console.log("Hello 2 " + JSON.stringify(data));

            weHaveSuccess = true;

            console.log('Message from Success ' + weHaveSuccess);

        },

        complete: function () {
            console.log('Message from Complete ' + weHaveSuccess);
        }

    }).done(function (data) {
        alert("Success");
        console.log(data);
    }).fail(function (data) {
        console.log(data);
        alert("Failed");
    }).always(function () {
        alert("In Always");
    });

    console.log(weHaveSuccess);
}

提前致谢!

3 个答案:

答案 0 :(得分:0)

AJAX请求是异步的。远程请求需要时间并作出响应。您必须在success函数内编写您的响应后代码,或者从那里调用另一个函数,而不是在调用启动的范围内。

我在这里猜一下你的服务器在失败时返回的内容。 AJAX请求成功意味着只接收到200 OK响应,而不考虑数据的内容。如果错误只是数据的更改,则需要执行以下操作之一以显示错误:

  1. 让服务器在失败时设置status code标头,可能是400 Bad Request
  2. success函数中查看data内的任何错误响应,并在那里触发alert()

答案 1 :(得分:0)

首先,console.log(weHaveSuccess);首先触发,因为$.ajax()是异步的,而console.log不是,所以ajax将被触发并在完成时返回promise,但浏览器将继续使用脚本。 在jQuery中,ajax文档说:

  

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

如果没有看到响应就很难调试,也许你可以从网络或URL添加一些信息?

答案 2 :(得分:0)

如果您尝试以下操作怎么样: 将jsonp设置添加到$.ajax()函数中以获取将处理响应的回调,并将console.log添加到那里:

function myCallback(data) {
    console.log(data);
}

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