Como eu pego um erro de postagem de consulta do Ajax?

209

Gostaria de pegar o erro e mostrar a mensagem apropriada se a solicitação do Ajax falhar.

Meu código é o seguinte, mas não consegui capturar a solicitação Ajax com falha.

function getAjaxData(id)
{
     $.post("status.ajax.php", {deviceId : id}, function(data){

        var tab1;

        if (data.length>0) {
            tab1 = data;
        }
        else {
            tab1 = "Error in Ajax";
        }

        return tab1;
    });
}

Descobri que "Erro no Ajax" nunca é executado quando a solicitação do Ajax falha.

Como manejo o erro do Ajax e mostro a mensagem apropriada se ele falhar?

TTCG
fonte

Respostas:

304

Desde o jQuery 1.5, você pode usar o mecanismo de objetos adiados:

$.post('some.php', {name: 'John'})
    .done(function(msg){  })
    .fail(function(xhr, status, error) {
        // error handling
    });

Outra maneira é usar .ajax:

$.ajax({
  type: "POST",
  url: "some.php",
  data: "name=John&location=Boston",
  success: function(msg){
        alert( "Data Saved: " + msg );
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
     alert("some error");
  }
});
escolher
fonte
14
O @Yuck $ .post pode aceitar um retorno de chamada de erro usando objetos adiados. Dê uma olhada na minha resposta abaixo para um exemplo.
Michael Venable
2
Além disso, uma maneira de tornar $.ajaxmais legível é usar um hash para o seu data. Por exemplo:{ name : 'John', location: 'Boston' }
briangonzalez 24/01
3
O sucesso de erro e chamadas de retorno acima são obsoletos a partir de jQuery 1.8 api.jquery.com/jQuery.post
Baldy
@MichaelVeneble eu acho que você pode usar$.post().error()
clintgh
288

O jQuery 1.5 adicionou objetos adiados que lidam bem com isso. Basta ligar $.poste anexar os manipuladores que desejar após a ligação. Objetos adiados ainda permitem anexar vários manipuladores de sucesso e erro.

Exemplo:

$.post('status.ajax.php', {deviceId: id})
    .done( function(msg) { ... } )
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
    });

Antes do jQuery 1.8, a função doneera chamada successe failchamada error.

Michael Venable
fonte
3
+1 Muito bom, mas ainda não é louco pela sintaxe. Espero que seja unificado em uma versão futura.
Yuck
25
Essa deve ser a resposta aceita. A resposta atualmente aceita é "use um método diferente"; esta resposta diz "aqui está como fazer seu método funcionar". Este último é geralmente preferido em SO. Na verdade, isso deve ser incluído na documentação do $ .post !!!
precisa
A propósito, também há responseJSONpropriedades que também são muito úteis no caso do tipo ajax json.
precisa saber é o seguinte
91
$.ajax({
  type: 'POST',
  url: 'status.ajax.php',
  data: {
     deviceId: id
  },
  success: function(data){
     // your code from above
  },
  error: function(xhr, textStatus, error){
      console.log(xhr.statusText);
      console.log(textStatus);
      console.log(error);
  }
});
jAndy
fonte
15
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });
marcenaria
fonte
5
Adicionar um pouco mais de explicação aqui ajudaria futuros leitores.
Eric Brown
13

Uma maneira simples é implementar o ajaxError :

Sempre que uma solicitação do Ajax é concluída com um erro, o jQuery aciona o evento ajaxError. Todo e qualquer manipulador que foi registrado com o método .ajaxError () é executado neste momento.

Por exemplo:

$('.log').ajaxError(function() {
  $(this).text('Triggered ajaxError handler.');
});

Eu sugeriria a leitura da documentação do ajaxError . Ele faz mais do que o simples caso de uso demonstrado acima - principalmente seu retorno de chamada aceita vários parâmetros:

$('.log').ajaxError(function(e, xhr, settings, exception) {
  if (settings.url == 'ajax/missing.html') {
    $(this).text('Triggered ajaxError handler.');
  }
});
karim79
fonte
1
+1 - Gostaria de acrescentar que esse manipulador recebe vários argumentos, para que possa exibir o erro real, código de resposta, url, etc.
Nick Craver
Observe que, a partir do jQuery 1.8, o método .ajaxError () deve ser anexado apenas ao documento.
Nanki
0

Você precisa registrar a resposta

$.ajax({
    type: 'POST',
    url: 'status.ajax.php',
    data: {
    deviceId: id
  }
})
.done(
 function (data) {
  //your code
 }
)
.fail(function (data) {
      console.log( "Ajax failed: " + data['responseText'] );
})
manolo
fonte
0

você anexa o manipulador .onerror ao objeto ajax, por que as pessoas insistem em postar JQuery para obter respostas quando o vanila trabalha em várias plataformas ...

exemplo rápido:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
Mark Giblin
fonte