Лучший способ проверить, был ли запрос AJAX успешным в jQuery
Я проверял, чтобы мои запросы AJAX были успешными, выполнив что-то вроде этого:
$.post("page.php", {data: stuff}, function(data, status) {
if(status == "success") {
//Code here
}
else {
//Error handling stuff
}
});
Проверяет ли переменная статуса лучший способ сделать это, или есть лучший способ убедиться, что запрос действительно прошел? Я рассматриваю "успешный" запрос как запрос, который попадает на страницу, которую я отправляю, чтобы успешно без тайм-аута (если сервер был выключен, и запрос AJAX был сделан до того, как он упал в качестве примера) или возвратил вид ошибки 404 или 500.
Ответы
Ответ 1
Вызывая $.post
таким образом, вы автоматически передаете только функцию success handler
.
Если что-то по запросу пошло не так, этот метод даже не выполняется.
Чтобы иметь больший контроль, используйте либо $.ajax()
напрямую, либо передайте обработчики сбоев. Это может выглядеть как
$.post("page.php", {data: stuff}, function(data, status) {
// we're fine here
}).fail(function(err, status) {
// something went wrong, check err and status
});
То же самое с помощью .ajax()
:
$.ajax({
type: 'POST',
url: 'page.php',
data: stuff,
success: function( data ) {
},
error: function(xhr, status, error) {
// check status && error
},
dataType: 'text'
});
Вы можете передать еще один обработчик событий ajax на $.ajax
, например beforeSend
, чтобы изменить/прочитать заголовки XHR или complete
, чтобы иметь обработчик, который запускается в любом случае (ошибка или нет), когда запросы завершены.
Ответ 2
Я предпочитаю использовать вызов ajax, поскольку он имеет явный обработчик успеха
$.ajax({
url: "page.php",
data: stuff,
success: function(response){
console.log("success");
}
});
Я бы также рекомендовал использовать firebug или webkit, поэтому вы можете отслеживать запросы и проверять параметры!
Ответ 3
jQuery, конечно, считает "успешным" в том, как он находится в исходном коде. Это не включает код состояния 404/500 и ни один тайм-аут, так как в этом случае код статуса не был возвращен.
Вы можете проверить, когда именно он возвращает "success"
:
// If successful, handle type chaining
if ( status >= 200 && status < 300 || status === 304 ) {
...
// If not modified
if ( status === 304 ) {
statusText = "notmodified";
...
// If we have data
} else {
try {
...
statusText = "success"; // So: only when status code is in
// the range 200 <= x < 300
...
} catch(e) {
...
statusText = "parsererror";
...
}
}