Как корректно распознавать ошибку $http в AngularJS?
Возникла следующая проблема.
В angularjs используется $http.post для загрузки данных с сервера. В случае, когда источник данных (своё API) по каким-то причинам недоступно (ну, или инета нет) $http возвращает status = 0 в обработчике error. Что нормально. Получив этот статус я хочу информировать пользователя о проблемах в сетью или API. Однако, этот же статус у запроса присваивается и в случае, когда происходит просто переход на другую страницу с прерыванием, соответственно, текущего ajax запроса (бывает такое невезение). И, естественно, в этом случае выдавать всякие пугающие мессаги пользователю ни к чему.
Вопрос - можно ли отделить мух от котлет, т.е. распознать прерывание запроса пользователем и реальную недоступность удалённого источника?
Я провел несколько экспериментов и поглулил. Действительно статус 0 и ни чего другого просто нет. Наверно так и надо определить. Если ошибка и статус 0 то сервер офлайн. Ни чего другого просто на ум не приходит.
Проблема не столько в том, чтобы определить недоступность сервера (да, error + status = 0 это, возможно, и будет означать), сколько в том, чтобы отфильтровать ложные срабатывания ошибки, например, просто в случае смены страницы. И в этом случае игнорировать ошибку, не пугая пользователя алертами о недоступности сервера.
Если не ошибаюсь, в jquery есть readyState и с помощью его (вместе с проверкой статуса) удавалось всё грамотно разруливать. Но вот Angular...
Но и потом с чего вы взяли что при переходе по страницам будет опять срабатывать запрос? В Ангулях это по другому работает. Даже если вы данные добавите на сервере, а странцу не обновите и ни кода не перейдете, данные на странице обновятся. Там всегда что то срабатывает. Так что боятся ложных сробатываний не стоит. Просто надо позаботится правильно. Если ошибка иммено запроса, то приложение должно как то затепнится с сообщением что его нельзя использовать. Ну или еще как в зависимости от важности данных.
Но и потом с чего вы взяли что при переходе по страницам будет опять срабатывать запрос
Не знаю, с чего взял - я про это вообще не писал :). Речь шла о том, что при смене страницы при активном запросе через $http, будет вызван обработчик error со status = 0. Пользователю о таких прерванных запросах знать не обязательно, в отличие от запросов, завершившихся с точно такой же ошибкой в случае недоступности API. Дело за малым - найти 10 отличий в обработке этих ситуаций :(
Ну я думаю если сервер найден и там просто урл не найден или не ответил то точно будет или 500 или 403 или 404.
Конкретно в этом случае - да. Но, к примеру, когда Java приложение деплоится, оно может быть недоступно совсем-совсем. Там уже корректного кода не будет. Или (если о мобильных говорить) - инет отвалился :). Это не всегда заметно пользователем.