2009-12-04 8 views
29

¿Puede jQuery proporcionar un respaldo para las llamadas AJAX fallidas? Este es mi intento:jQuery: Handle fallback para la solicitud fallida de AJAX

function update() { 
    var requestOK = false; 

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

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

Por desgracia, aunque la función de devolución de llamada de la .getJSON $() es llamado, me sale el mensaje de petición falló ', antes de la función de devolución de llamada tiene la oportunidad de establecer el requestOK variable. Creo que es porque el código se ejecuta en paralelo. ¿Hay alguna manera de manejar tales situaciones? Pensé en el encadenamiento o alguna forma de esperar la solicitud de AJAX, incluida su función de devolución de llamada. ¿Pero cómo? ¿Alguien sabe cómo hacer eso?

Respuesta

61

Deberá utilizar la llamada de nivel inferior $.ajax o la función ajaxError. Aquí está con el método $ .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'); 
    } 
    }); 
} 

EDITAR he añadido un timeout a la llamada $.ajax y la puso a cinco segundos.

+0

eso ya es genial! pero parece que no funciona, si la conexión a Internet no funciona :(. eso es bastante importante, porque estoy desarrollando un widget de tablero para osx y quiero mostrar algún tipo de mensaje, diciendo que una solicitud no era posible. otros consejos? –

+0

@Patrick, actualicé mi respuesta para incluir el parámetro 'timeout'. Debería llamar a la función de error después de 5 segundos si la conexión a Internet no funciona. –

+1

¡gracias ton! ¡funciona perfectamente! –

1

Sí, está integrado en jQuery. Consulte los documentos en jquery documentation.

ajaxError puede ser lo que quieras.

0

Creo que lo que busca es la opción de error para el jQuery ajax object

getJSON es un envoltorio al objeto $.ajax, pero no le proporciona con acceso a la opción de error.

EDIT: dcneiner ha dado un buen ejemplo del código que necesitaría usar. (Incluso antes de que pudiera publicar mi respuesta)

+0

No se pudo obtener acceso a los errores por parte de getJSON. Puede acceder a la opción de error mediante la forma de encadenar la llamada getJSON. Ver la respuesta de @Lasse Dahl Ebert. – Fydo

+1

@Fydo - esta respuesta en realidad * es anterior a * jQuery's Deferred por más de un año ;-) En ese momento, ahora había forma de tener acceso al error, había que bajar al método '$ .ajax'. –

8

La respuesta de Dougs es correcta, pero en realidad puede usar $.getJSON y detectar errores (no tener que usar $.ajax). Sólo encadenar la llamada getJSON con una llamada a la función fail:

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

Demostración en directo: http://jsfiddle.net/NLDYf/5/

Este comportamiento es parte de la interfaz jQuery.Deferred.
Básicamente le permite adjuntar eventos a una acción asíncrona después de a la que llama acción, lo que significa que no tiene que pasar la función de evento a la acción.

Leer más sobre jQuery.Deferred aquí: http://api.jquery.com/category/deferred-object/

+1

'.error()' está en desuso a partir de jQuery v1.8 y debe usar '.fail()'. – Cobby

+0

Gracias. Lo corregí. –

0

prefiero este enfoque, ya que puede devolver la promesa y utilizar .then (successFunction, failFunction); donde sea que necesites

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); 
Cuestiones relacionadas