[英]Try/Catch with jquery ajax request
我正在嘗試構建一個發出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!");
}
但仍然沒有。
該錯誤是由於它是異步的,還是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錯誤回調函數本身不會拋出異常。 如果你想要一個try / catch,你應該在錯誤函數中自己拋出一個異常。 這將觸發您周圍的捕獲。
PS! 有時您需要在需要評估結果時在ajax調用中設置async:false參數,因為默認情況下,代碼將在啟動ajax請求后繼續,並在稍后階段異步調用成功或錯誤回調並且僅調用碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.