Tengo la siguiente llamada ajax y si falla, tengo un mensaje de error predeterminado almacenado en una constante que «usaré si la respuesta no contiene un mensaje personalizado. Cuando miro esto, sigo pensando que se podría hacer mejor. ¿Alguien puede sugerir cómo puedo hacerlo mejor?
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"); } }); };
Comentarios
- ¡Bienvenido a Code Review! He cambiado tu título para decir mejor lo que hace el código, en lugar de que ' quieras mejorarlo (que ' es el toda la intención del sitio, después de todo). ¡Espero que obtenga excelentes respuestas!
Respuesta
Yo diría que es más o menos por- el libro ya, pero puede usar el bloque catch
para establecer el valor predeterminado:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { errorMessage = AJAX_ERROR; } displayError(errorMessage); }
O bien, puede utilizar la fórmula try...catch...finally
completa, si lo desea:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { errorMessage = AJAX_ERROR; } finally { displayError(errorMessage); } }
O puede intentar obtener el mensaje de error personalizado , y solo incumpliendo en el último momento:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { // ignored } displayError(errorMessage || AJAX_ERROR); }
La posible ventaja de esto es que si el servidor por cualquier motivo envía un espacio en blanco (falso «y) mensaje de error lo anterior seguirá siendo el mensaje de error genérico por defecto, aunque no se lanzaron excepciones.
En cualquier caso, el enfoque general me parece correcto. No existe una forma realmente más limpia de obtener el servidor «s, ya que debe analizar el JSON y profundizar en la estructura. Cualquiera de las dos cosas puede generar excepciones, por lo que try...catch
es la forma más sencilla de manejando eso. Como mínimo, necesita el try..catch
para JSON.parse
de todos modos, por lo que también puede usarlo para ambas cosas.
Comentarios
- Gracias, estas son algunas sugerencias útiles y me siento más seguro de haber tenido otro par de ojos en ello también.