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

JQuery: откат обратной связи для отказавшего запроса AJAX

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

function update() {
    var requestOK = false;

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

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

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

4b9b3361

Ответ 1

Вам нужно либо использовать нижний уровень $. ajax, либо ajaxError. Вот он с методом $.ajax:

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

EDIT Я добавил вызов timeout в вызов $.ajax и установил его на пять секунд.

Ответ 2

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

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

Live demo: http://jsfiddle.net/NLDYf/5/

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

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

Ответ 3

Да, он встроен в jQuery. См. Документы в jquery documentation.

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

Ответ 4

Я считаю, что то, что вы ищете, это параметр ошибки для jQuery объект ajax

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

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

Ответ 5

Я предпочитаю этот подход, потому что вы можете вернуть обещание и использовать .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);