簡體   English   中英

嘗試/捕獲jquery ajax請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM