尝试/捕获jquery ajax请求

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

如果我将ajax调用移出background.html脚本(我在开发人员窗口中看不到请求),那么对于options.html脚本,我会得到一个对话框来重新进行身份validation。 如果我点击取消,那么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!"); } 

但仍然没有。

错误是由于它是异步的,还是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" }); 

ajax错误回调函数本身不会抛出exception。 如果你想要一个try / catch,你应该在错误函数中自己抛出一个exception。 这将触发您周围的捕获。

PS! 有时您需要在需要评估结果时在ajax调用中设置async:false参数,因为默认情况下,代码将在启动ajax请求后继续,并在稍后阶段异步调用成功或错误回调并仅调用码。