2012-04-06 18 views
23

In un jQuery Ajax chiamata Attualmente sto maneggiando statusCode di 200 e 304. Ma ho anche "errore" definito" Per catturare tutti gli errori che potrebbe tornare.

Se c'è un messaggio di convalida legato torniamo il codice di stato 400 -. Bad Request

Questo rientra quindi nella funzione "Error" prima di cadere nella funzione statusCode "400" avevo definito il che significa due azioni avvengono

.. Idealmente non mi piacerebbe definire "Errore" e "Successo" e definire solo "statusCode" Ma quello di cui ho bisogno è avere un "Else" in modo che non mi serva dichiarare ogni statusCode che esiste solo il 2-3 che voglio gestire in modo diverso.

$.ajax({ 
     type: 'POST', 
     contentType: "application/json", 
     url: "../API/Employees.svc/" + EmployeeId + "/Company/" + CompanyId, 
     data: jsonString, 
     statusCode: { 
      200: function() { //Employee_Company saved now updated 

       hideLoading(); 
       ShowAlertMessage(SaveSuccessful, 2000); 
       $('#ManageEmployee').dialog('close'); 

      }, 
      304: function() { //Nothing to save to Employee_Company 

       hideLoading(); 
       $('#ManageEmployee').dialog('close'); 

       if (NothingToChange_Employee) { 
        ShowAlertMessage(NothingToUpdate, 2000); 
       } else { 
        ShowAlertMessage(SaveSuccessful, 2000); 
       } 
      } 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      AjaxError(XMLHttpRequest, textStatus, errorThrown); 
     } 
    }); 

risposta

29

Poiché l'evento "complete" è sempre sparato si può semplicemente ottenere il codice di stato da lì e ignorare le funzioni di successo e di errore

complete: function(e, xhr, settings){ 
    if(e.status === 200){ 

    }else if(e.status === 304){ 

    }else{ 

    } 
} 
+0

questo sembra funzionare abbastanza bene ed è una buona risposta, anche se nella mia situazione ho finito con realtà utilizzando sia successo e non è riuscito. e fai una dichiarazione simile se hai sopra in ciascuna. – Steve

+12

completato() è ora deprecato. Usa metodi di sostituzione fatti, falliti, sempre. – redochka

9

Questo è quello che userei:

error: function (xhr, textStatus, errorThrown) { 
    switch (xhr.status) { 
     case 401: 
      // handle unauthorized 
      break; 
     default: 
      AjaxError(xhr, textStatus, errorThrown); 
      break; 
    } 
} 
2

jQuery Risposta AJAX complete, success, error sono stati deprecati. Versione più aggiornata con .done, .fail, .always promessa.

In caso di successo, .always ha la firma di .done, in caso di errore, le modifiche alla sua firma sono state apportate a .fail. Usando lo textStatus puoi prendere la variabile corretta e restituire il contenuto del corpo.

var jqxhr = $.ajax({ 
    type: frm.attr('method'), 
    url: frm.attr('action'), 
    data: frm.serialize(), 
    dataType: 'json', 
    }) 

    .done(function(data, textStatus, jqXHR) { 
     alert("success"); 
    }) 
    .fail(function(jqXHR, textStatus, errorThrown) { 
     alert("error"); 
    }) 

    .always(function(data_jqXHR, textStatus, jqXHR_errorThrown) { 

     if (textStatus === 'success') { 
      var jqXHR = jqXHR_errorThrown; 
     } else { 
      var jqXHR = data_jqXHR; 
     } 
     var data = jqXHR.responseJSON; 

     switch (jqXHR.status) { 
      case 200: 
      case 201: 
      case 401: 
      default: 
       console.log(data); 
       break; 
     } 

}); 

jqxhr.always(function() { 
    alert("second complete"); 
}); 
+0

'jqXHR.error()' è stato deprecato, non l'opzione 'error' di' jQuery.ajax() '. Non so se è implicitamente deprecato insieme ad esso, ma almeno non è documentato come deprecato. – falstro

1

Per mantenere l'approccio simile alla logica iniziale, continuerei a passare un oggetto statusCode. Tuttavia, si sa ancora che "else" cadrà nel regno dei codici di errore di tipo 4xx o 5xx.

Quindi mi sento di aggiornare il codice originale:

var statusCodeResponses = { 
    200: function() { //Employee_Company saved now updated 

     hideLoading(); 
     ShowAlertMessage(SaveSuccessful, 2000); 
     $('#ManageEmployee').dialog('close'); 

    }, 
    304: function() { //Nothing to save to Employee_Company 

     hideLoading(); 
     $('#ManageEmployee').dialog('close'); 

     if (NothingToChange_Employee) { 
      ShowAlertMessage(NothingToUpdate, 2000); 
     } else { 
      ShowAlertMessage(SaveSuccessful, 2000); 
     } 
    } 
}; 

var genericElseFunction = function(response){ 
    // do whatever other action you wanted to take 
}; 

for(var badResponseCode=400; badResponseCode<=599; badResponseCode++){ 
    statusCodeResponses[badResponseCode] = genericElseFunction; 
} 

$.ajax({ 
    type: 'POST', 
    contentType: "application/json", 
    url: "../API/Employees.svc/" + EmployeeId + "/Company/" + CompanyId, 
    data: jsonString, 
    statusCode: statusCodeResponses, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     AjaxError(XMLHttpRequest, textStatus, errorThrown); 
    } 
});