Ant*_*ony 15 ajax jquery exception-handling
我正在尝试构建一个发出ajax请求的Google Chrome扩展程序.类似于GMail Checker扩展的东西.问题是当我使用jquery执行请求时,我输入了错误的用户名/密码,它会无声地失败,并忽略错误回调函数.
如果我将ajax调用移出background.html脚本(我在开发人员窗口中看不到请求),那么对于options.html脚本,我会得到一个对话框来重新进行身份验证.如果我点击取消,那么jquery错误回调将触发.
但是在原始模型扩展(再次,Gmail检查器)中,他们使用带有try/catch的普通(非jquery)ajax调用,如果我输入了错误的凭据,我会得到一个警告说同样多.
我尝试在try/catch中包装整个jquery调用,如下所示:
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!");
}
Run Code Online (Sandbox Code Playgroud)
但仍然没有.
该错误是由于它是异步的,还是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.');
}
Run Code Online (Sandbox Code Playgroud)
Neo*_*tis 14
尝试更像这样的东西,无论发生什么,你都有一个在完成每个请求后运行的函数.这应该解决问题:
// 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"
});
Run Code Online (Sandbox Code Playgroud)