bootd
@bootd
Гугли и ты откроешь врата знаний!

Как уменьшить кол-во ajax запросов?

У меня стоит задача сделать интерактивный выбор квартир в доме. Реализовано на svg. При клике на элемент g(g - разделяет области для наведения, а области это квартиры) я открываю окно с данными о квартире. В силу структуры, все данные загружаются через ajax. Все ок. 1 Клик, 1 запрос, данные получил.

Но так же появилась надобность сделать всплывающую подсказку, которая появляется при наведении на элемент g. В ней указывается цена квартиры, площадь и т.д. Значит, приходится делать снова запрос, но вот не задача, пока тестировал, понял, что каждый ховер на один и тот же элемент - это еще один запрос. А их может быть сотни за пару секунд, просто дрыгая мышкой. Посоветуйте, как реализовать так, что бы уменьшить кол-во запросов к бд.

Вот код для ховера:
$(document).on('mouseover', '.apartment', function() {
        var id = $(this).attr('id').substr(0,3),
            gData = $(this)[0].getBoundingClientRect();
            tooltip = $('#tooltip'),
            tipNum = $('#tipNum'),
            tipArea = $('#tipArea'),
            tipPrice = $('#tipPrice');

        // Сделаем запрос к бд и вытащим наши данные
        $.ajax({
            url: '/request.php?a=apartment',
            type: 'post',
            data: {id: id}
        }).done(function(res) {
            if(res){
                // Разложим нашу инфу по полочкам
                tipNum.html(res.apartment.num);
                tipArea.html(res.apartment.area);
                tipPrice.html(res.apartment.price);


                if(res.apartment.num || res.apartment.area || res.apartment.price){
                    tooltip.show();

                    tooltip.css({
                        'top': gData.top + (gData.height / 2) - 100,
                        'left': gData.left + gData.width + 15
                    });
                }
            }

        }).fail(function() {
            console.log("Не удалось получить данные о квартире!");
        });
    });
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
nonlux
@nonlux
Frontend
1. Временный Кеш.
При первом наведении на g.
- Делаете запрос один раз.
- Результат сохраняете в переменную (массив, объект).
- Выводите подсказку
При следующем наведении на g
- Достаете данные
- Выводите подсказку

Профит 1 запрос на каждый g.

2. Постоянный кеш.
В этом случае часть данных можно сохранить в local storage.
Например для постоянных пользователей можно сохранить редко изменяемые данные.

3. Инклудим в приложение
Часть данных можно отдавать сразу в приложение с загрузкой страницы.

4. Объединение запросов
Можно объедить все квартиры в коллекцию и отдавать одним ajax запросом.

Backend
Кеш никто не отменял.
Необязательно на каждый плевок пользователя делать запрос к базе.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
bigton
@bigton
Web-программист
Почему бы все данные не хранить в json массиве который сразу будет находится в теле страницы? Даже если у вас 100 квартир и по каждой есть информация о площади и стоимости, такой подход гораздо удобнее, чем каждый раз дергать сервер чтобы запросить пару строк. Ну и во всех своих события просто читайте массив.
Ответ написан
Комментировать
Feaxer
@Feaxer
Программист-фрилансер
он маузовер {
если апартментс_дата[id] существует, то информацию взять из апарментс_дата[id]
иначе { аякс запрос на получение информации; сохранение полученной информацией в массив апартментс_дата с ключем id }
}
Ответ написан
Комментировать
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Ну и, конечно, навесить debounce на обработчик ховера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы