Подтвердить что ты не робот

Попробовать/Поймать с помощью jquery ajax request

Я пытаюсь создать расширение Google Chrome, которое делает запрос ajax. Что-то похожее на расширение GMail Checker. Проблема в том, что когда я выполняю запрос с использованием jquery, и я ввел неправильное имя пользователя/пароль, он терпит неудачу, при этом функция обратного вызова ошибки игнорируется.

Если я переведу вызов ajax из background.html script (где я не вижу запросы в окне разработчика), в options.html script, я получаю диалоговое окно, аутентификации. Если я нажму на отмену, ТОГДА срабатывает обратный вызов ошибки jQuery.

Но в исходном расширении модели (опять же, Gmail checker) они используют простые (не jquery) ajax-вызовы с try/catch, и если я ввел неправильные учетные данные, я получаю предупреждение, говорящее так же.

Я попробовал обернуть весь вызов 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?

Update

Вот очень тонкая версия того, как код модели выполняет запрос:

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.');
}
4b9b3361

Ответ 1

Попробуйте что-то более похожее на это, где у вас есть функция, выполняемая при каждом запросе после завершения, независимо от того, что происходит. Это должно решить проблему:

// 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"
});

Ответ 2

Функция обратного вызова ошибки ajax не генерирует исключение самостоятельно. Если вы хотите попробовать/поймать, вы, вероятно, должны throw исключение самостоятельно внутри своей функции ошибки. Это вызовет ваш окружающий улов.

PS! Иногда вам нужно установить параметр async: false в вызове ajax, когда вам нужно оценить результат, потому что по умолчанию код будет продолжаться после того, как будет инициирован запрос ajax и асинхронно вызовет успешный или обратный вызов ошибки на более позднем этапе и вызовет только этот вызов код.