Отправка нескольких запросов AJAX, в результате которых отправляется форма, приводит к неожиданному результату - PullRequest
2 голосов
/ 08 апреля 2020

Извините за заголовок вопроса, но я даже не знаю, как задать этот D;

Допустим, на моей странице есть какой-то формуляр для добавления данных в список, и каждый раз, когда вы хотите добавить новые данные, они сначала вставляются в базу данных, затем обновляется ваша страница (ужасный дизайн, но просто представьте себе для примера!).

Итак, у нас есть кнопка, которая выполняет запрос AJAX , Когда сервер получает запрос, он выполняет некоторую проверку и в конечном итоге возвращает успех. В успешной части AJAX я заканчиваю тем, что отправляю данные формул, которые были вставлены в поле ввода. Итак, с сервером выполняется 2 вызова: сначала запрос AJAX, затем отправка формы. Мой браузер занимает 3 секунды для отображения списка.

Теперь представьте, что я нажимаю кнопку 3 раза так быстро, что первый запрос AJAX даже не выполняется (Представьте себе метод запроса AJAX на сервере спит 1000, что дает мне время для этого). Через 6 секунд браузер обновляется, и список повторяет те же данные 3 раза. Я понимаю, почему данные появляются 3 раза, когда я создаю три разных потока, а код на сервере выполняется 3 раза (я вижу, что журналы появляются в консоли 3 раза).

Но я не понимаю действительно не понимаю, что происходит, когда первый AJAX запрос достигает метода "redirect" или "render". Почему рендеринг реальной страницы занимает 6 ~ секунд? Потому что я мог понять, чтобы увидеть 3 различных "refre sh" с задержкой 2 ~, но появляется круг загрузки, и мне просто нужно подождать. Меня не беспокоит «задержка», потому что способ кодирования ужасно плох, и он изменится в будущем, но я действительно хочу понять, почему это происходит, и как сервер обрабатывает несколько AJAX запросов когда дело доходит до рендеринга новой страницы.

Пример кода:

Вид:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>dfsfsd</title>
    <g:javascript library='jquery' />
    <r:layoutResources/>
</head>
<body>

<g:form url="[action:'addToDatabase',controller:'main']" id="addDataForm">
    <label>Data Name</label>
    <input type="text" name="dataName" id="inputDataName">
</g:form>
    <button type="button" id="addToDatabaseButton">Add Data</button>

<script>
    $("#addToDatabaseButton").on( "click", function() {
        $.ajax({
            url: "${createLink(controller: "main", action: "ajaxCheck")}",
            type: "post",
            cache: false,
            success: function () {
                $("#addDataForm").submit();
            }
        });
    });

</script>

</body>
</html>

Сторона сервера:

class MainController {

    def index() {
        []
    }

    def addToDatabase() {
        log.error ("We recieve $params.dataName")
        sleep 2000
        redirect(controller: "main", action: "index")
    }

    def ajaxCheck (){
        def map = [:]
        map.put("result","OK")
        render map as JSON
    }
}

Теперь, там 2-секундная задержка, которая означает, что я вставляю что-то в базу данных. Есть log.error для отображения элемента, который я пытаюсь вставить. Как вы можете видеть, когда я набираю «Имя A» и нажимаю «Добавить данные», отображается значение, и через 2 секунды страница перезагружается.

Но если я продолжаю нажимать кнопку, задержка составит 2 секунды. обновляется, и я не понимаю, почему я не люблю смотреть браузер refre sh 3 раза или что-то в этом роде, почему только один раз?

example

1 Ответ

0 голосов
/ 08 апреля 2020

не связано ли это с запросами кеширования вашего браузера? если вы отправляете точно такой же запрос, он может быть кэширован на лету.

В Firefox установите флажок Dev tools -> Network -> Disable cache. Снимок экрана:

enter image description here

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