Попробовать/Поймать с помощью 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.');
}
Ответы
Ответ 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 и асинхронно вызовет успешный или обратный вызов ошибки на более позднем этапе и вызовет только этот вызов код.