jQuery: обработать откат для неудачного запроса AJAX - PullRequest
37 голосов
/ 04 декабря 2009

Может ли jQuery предоставить запасной вариант для неудачных вызовов AJAX? Это моя попытка:

function update() {
    var requestOK = false;

    $.getJSON(url, function(){
        alert('request successful');
        requestOK = true;
    });

    if (!requestOK) {
        alert('request failed');
    }
}

К сожалению, даже если вызывается функция обратного вызова метода $ .getJSON (), я получаю сообщение «запрос не выполнен», прежде чем функция обратного вызова сможет установить переменную requestOK. Я думаю, это потому, что код работает параллельно. Есть ли способ справиться с такими ситуациями? Я думал о цепочке или некотором способе ожидания AJAX-запроса, включая функцию обратного вызова. Но как? Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

74 голосов
/ 04 декабря 2009

Вам потребуется либо использовать вызов нижнего уровня $. Ajax , либо функцию ajaxError . Вот это с методом $ .ajax:

function update() {
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000,
    success: function(data, textStatus ){
       alert('request successful');
    },
    fail: function(xhr, textStatus, errorThrown){
       alert('request failed');
    }
  });
}

РЕДАКТИРОВАТЬ Я добавил timeout к вызову $.ajax и установил его на пять секунд.

9 голосов
/ 05 декабря 2012

Ответ Дугса правильный, но вы на самом деле можете использовать $.getJSON и ловить ошибки (без необходимости использовать $.ajax). Просто соедините вызов getJSON с вызовом функции fail:

$.getJSON('/foo/bar.json')
    .done(function() { alert('request successful'); })
    .fail(function() { alert('request failed'); });

Живая демоверсия: http://jsfiddle.net/NLDYf/5/

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

Подробнее о jQuery. Отложено здесь: http://api.jquery.com/category/deferred-object/

2 голосов
/ 04 декабря 2009

Да, он встроен в jQuery. См. Документацию по документации jquery .

ajaxError может быть тем, что вы хотите.

1 голос
/ 22 декабря 2017

Я предпочитаю этот подход, потому что вы можете вернуть обещание и использовать .then (successFunction, failFunction); куда вам нужно.

var promise = $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000
  }).then(function( data, textStatus, jqXHR ) {
    alert('request successful');
  }, function( jqXHR, textStatus, errorThrown ) {
    alert('request failed');
});

//also access the success and fail using variable
promise.then(successFunction, failFunction);
0 голосов
/ 04 декабря 2009

Я считаю, что вам нужна опция ошибки для объекта jquery ajax

getJSON - это обертка для объекта $.ajax, но она не предоставляет вам доступ к опции ошибки.

EDIT: dcneiner привел хороший пример кода, который вам нужно будет использовать. (Еще до того, как я смог опубликовать свой ответ)

...