我正在尝试构建一个发出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.'); }
尝试类似这样的方法,在该函数中,无论发生什么情况,一旦完成,您就可以对每个请求运行。这应该可以解决问题:
// 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" });