Попробуйте / Catch с JQuery AJAX запроса - PullRequest
14 голосов
/ 11 мая 2010

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

Если я перемещаю вызов ajax из сценария background.html (где я не вижу запросы в окне разработчика), в сценарий options.html, я получаю диалоговое окно для повторной проверки подлинности. Если я нажму «Отмена», то сработает обратный вызов jquery error.

Но в исходном расширении модели (опять же, в проверке Gmail) они используют простые (не 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.');
}

Ответы [ 2 ]

13 голосов
/ 13 февраля 2012

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

// 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"
});
3 голосов
/ 15 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...