一尘不染

尝试/捕获与jQuery Ajax请求

ajax

我正在尝试构建一个发出ajax请求的Google Chrome扩展程序。与GMail
Checker扩展程序类似。问题是,当我使用jquery进行请求时,并输入了错误的用户名/密码时,它会静默失败,并忽略错误回调函数。

如果我将ajax调用从background.html脚本(在开发人员窗口中看不到请求)中移出到options.html脚本中,则会得到一个对话框来重新进行身份验证。如果我点击取消,则触发jquery错误回调。

但是在原始模型扩展(同样是Gmail检查器)中,它们使用带有try /
catch的普通(非jquery)ajax调用,并且如果我输入了错误的凭据,我会得到同样多的警报。

我尝试将整个jquery调用包装在try / catch中,如下所示:

try {
    $.ajax({
        type: "POST",
        url: someurl,
        contentType : "text/xml",
        data: somedata,
        username: user,
        password: pass,
        success: function(data,status,xhr){
            alert("Hurrah!");
        },
        error: function(xhr, status, error){
            alert("Error!" + xhr.status);
        },
        dataType: "xml"
    });
} catch(e) {
    alert("You messed something up!");
}

但是仍然没有。

是由于异步而导致错误,还是Chrome由于要重新提示输入凭据而没有将请求作为错误返回?还是我只是不知道如何使用try / catch?

更新资料

这是模型代码如何完成请求的非常简化的版本:

var req = new XMLHttpRequest();
req.onreadystatechange = function() {
    try {
        if ( req.readyState == 4 ) {
            //Do some stuff with results
        }
    }
    catch (ex) {
        alert('Error parsing response.');
    }
}
try {
    req.send (data);
}
catch (ex) {
    alert ('Something went wrong with the request.');
}

阅读 213

收藏
2020-07-26

共1个答案

一尘不染

尝试类似这样的方法,在该函数中,无论发生什么情况,一旦完成,您就可以对每个请求运行。这应该可以解决问题:

// Store a global var so we can all play nicely.

// Make sure this gets reset to false right before your AJAX call,
// or it will only work once!
var weHaveSuccess = false;

$.ajax({
    type: "POST",
    url: someurl,
    contentType : "text/xml",
    data: somedata,
    username: user,
    password: pass,
    success: function(data,status,xhr){
        alert("Hurrah!");
        weHaveSuccess = true;
    },
    error: function(xhr, status, error){
        alert("Error!" + xhr.status);
    },
    complete: function(){
        if(!weHaveSuccess){
             alert('Your username/password seems to be incorrect!');
        }
    },
    dataType: "xml"
});
2020-07-26