Пропустить $ .ajax (). Fail (), когда определен глобальный обработчик ошибок - PullRequest
0 голосов
/ 30 апреля 2018

Я определяю глобальный обработчик ошибок jQuery для кодов состояния 500 (механизм повторных попыток с некоторым сообщением, когда повторная попытка исчерпана). Я хотел бы переопределить любое .fail() обещание, которое могло быть добавлено к запросу $.ajax. Мой код ниже:

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
        <script type="text/javascript">

            function call() {

                $.ajax({
                  url: '/rest/api/v1/some_errorneous_parth',
                  retryCount:3,
                  method: 'GET'
                }).done(function(data){
                    console.log(data);
                }).fail(function() {
                    console.log("should not print");
                });
            }

            $(document).ready(function () {
                $.ajaxSetup({
                    retryCount: 3,
                    error: function retry(response) {
                        if(response.statuscode === 500) {
                            if(--this.retryCount){
                                $.ajax(this);
                            }
                            else {
                                console.log("sorry, i've 'tried everything");
                            }
                        }
                    }
                });
            });
        </script>
    </head>
    <body>
        <input type="button" onclick="call()" value="submit"/>
    </body>
</html> 

Я бы хотел, чтобы should not print не печатался, если сервер возвращает 500, пока счетчик повторов не будет исчерпан.

1 Ответ

0 голосов
/ 30 апреля 2018

Несколько замечаний ...

Документация jQuery говорит о .ajaxSetup()

... мы настоятельно рекомендуем не использовать этот API.

В документации также сказано:

Все последующие вызовы Ajax, использующие любую функцию, будут использовать новые настройки, если они не будут переопределены отдельными вызовами, до следующего вызова $ .ajaxSetup ().

Следовательно, вы ожидаете, что опция в запросе $ .ajax будет переопределена соответствующей опцией, установленной в ajaxSetup, задом наперед. Переопределение работает наоборот.

В любом случае параметры .done() и .fail() не подчиняются правилу "переопределено отдельными вызовами". Обратный вызов сбоя, установленный в ajaxSetup, и обратный вызов сбоя, установленный в отдельном вызове, будут (при ошибке) ОБА - в этом порядке. В документации нет предупреждений об этом.

Произвольные параметры, такие как retryCount, будут игнорироваться.

Повторные попытки необходимо организовать другими способами - см., Например, Схемы проектирования Promise Retry

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...