Mam następujące wywołanie AJAX i jeśli wystąpi błąd, mam domyślny komunikat o błędzie przechowywany w stałej, którego użyję jeśli odpowiedź nie zawiera niestandardowego komunikatu. Kiedy na to patrzę, myślę, że można to zrobić lepiej. Czy ktoś może podpowiedzieć, jak mogę to zrobić lepiej?
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"); } }); };
Komentarze
- Witamy w przeglądzie kodu! Zmieniłem Twój tytuł, aby lepiej opisywał działanie kodu, zamiast tego, ' chciałbyś go ulepszyć (' to w końcu cały zamiar witryny). Mam nadzieję, że otrzymujesz świetne odpowiedzi!
Odpowiedź
Powiedziałbym, że to prawie przez- książka jest już dostępna, ale możesz użyć bloku catch
, aby ustawić wartość domyślną:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { errorMessage = AJAX_ERROR; } displayError(errorMessage); }
Lub możesz jeśli chcesz, możesz użyć pełnego wyrażenia try...catch...finally
:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { errorMessage = AJAX_ERROR; } finally { displayError(errorMessage); } }
Możesz też spróbować uzyskać niestandardowy komunikat o błędzie i domyślną tylko w ostatniej chwili:
error: function(err){ var errorMessage; try { errorMessage = JSON.parse(err.responseText).messages.messages[0].description; } catch(exception) { // ignored } displayError(errorMessage || AJAX_ERROR); }
Możliwa zaleta jest taka, że jeśli serwer z jakiegoś powodu wysyła puste miejsce (false „y) powyższy komunikat o błędzie będzie nadal domyślnie generycznym komunikatem o błędzie, mimo że nie zostały zgłoszone żadne wyjątki.
W każdym razie ogólne podejście wydaje mi się w porządku. Nie ma tak naprawdę czystszego sposobu na uzyskanie serwera ”, ponieważ musisz przeanalizować JSON i zagłębić się w strukturę. Każda rzecz może generować wyjątki, więc try...catch
jest najprostszym sposobem radzenie sobie z tym. Jako minimum potrzebujesz try..catch
dla JSON.parse
i tak, więc równie dobrze możesz go używać do obu rzeczy.
Komentarze
- Dzięki, to kilka pomocnych sugestii i czuję się pewniej, mając na to kolejną parę oczu!