Ho la seguente chiamata ajax e se si verifica un errore, ho un messaggio di errore predefinito memorizzato in una costante che userò se la risposta non contiene un messaggio personalizzato. Quando guardo questo, continuo a pensare che potrebbe essere fatto meglio. Qualcuno può suggerire come posso farlo meglio?
function requestService(){ $.ajax({ dataType: "json", type: "POST", url: "/myurl", contentType: CONTENT_TYPE, timeout: AJAX_TIMEOUT, success: function(data, textStatus, jqXHR){ populateData(JSON.parse(jqXHR.responseText)) }, error: function(err){ var errorMessage = AJAX_ERROR; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(error) { //There was an problem finding an error message from the server. The default message will be used. } displayError(errorMessage) }, complete: function(){ console.log("complete"); } }); };
Commenti
- Benvenuto in Code Review! Ho cambiato il tuo titolo per meglio dire cosa fa il codice, piuttosto che ' vorresti migliorarlo (che ' è il lintero intento del sito, dopotutto). Spero che tu riceva delle ottime risposte!
Risposta
Direi che è praticamente da- the-book già, ma potresti utilizzare il blocco catch
per impostare il valore predefinito:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { errorMessage = AJAX_ERROR; } displayError(errorMessage); }
Oppure tu puoi utilizzare la formulazione try...catch...finally
completa, se vuoi:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { errorMessage = AJAX_ERROR; } finally { displayError(errorMessage); } }
Oppure puoi provare a ricevere il messaggio di errore personalizzato , e di default solo allultimo momento:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { // ignored } displayError(errorMessage || AJAX_ERROR); }
Il possibile vantaggio di questo, è che se il server per qualsiasi motivo invia uno spazio vuoto (false “y) messaggio di errore di cui sopra sarà ancora predefinito il messaggio di errore generico, anche se non sono state lanciate eccezioni.
In ogni caso lapproccio generale mi sembra OK. Non esiste un modo più pulito per ottenere il server “messaggio di errore, dal momento che devi analizzare il JSON e scavare in profondità nella struttura. Entrambe le cose possono generare eccezioni, quindi try...catch
è il modo più semplice di gestirlo. Almeno hai bisogno di try..catch
per JSON.parse
comunque, quindi potresti anche usarlo per entrambe le cose.
Commenti
- Grazie, questi sono alcuni suggerimenti utili e mi sento più fiducioso di aver avuto anche un altro paio di occhi su di esso!