Когда я читал ваше описание, я подумал о двух вещах: асинхронность и кэширование.
Во-первых, асинхронность
Зачем вам блокировать на 0,5 с? Почему бы не использовать вызов ajax, а в обратном вызове обновите страницу с полученной информацией. В течение заданного времени блокировки не происходит, это делается асинхронно. Вы должны были бы подавить многократные щелчки, хотя запрос является ожидающим, но это не должно быть проблемой вообще.
Вы также можете предварительно загрузить внутристраничный кеш в фоновом режиме, используя setInterval
или лучше, setTimeout
. Особенно имеет смысл, если затраты на вычисление или создание календаря велики, а размер данных относительно невелик - иными словами, достаточно мал, чтобы хранить месяцы во внутреннем кеше, даже если он никогда не используется. Похоже, что вы делаете это в любом случае и должны блокировать только когда пользователь выпрыгивает из диапазона кэшированных данных.
Интеллектуальное кэширование
Я представляю себе функцию обратного вызова - ту, которая вызывается после завершения вызова ajax - проверит, находится ли текущая выбранная дата на «краю» кэшируемых данных - либо первая неделя в кэше, либо последняя неделя ( или что угодно). Если пользователь находится на грани, то обратный вызов может отправить дополнительный запрос для оптимистической предварительной загрузки кэша до предела 4 недели или любого другого временного диапазона, который имеет смысл для ваших 80% случаев использования.
Вы также можете рассмотреть возможность кэширования сгенерированных календарных данных на серверной стороне для каждого пользователя. Если генерация этих вещей требует много ресурсов процессора и времени, то будет хорошей сделкой сгенерировать один раз и сохранить ее в кэше на стороне сервера, аннулируя только тогда, когда пользователь делает обновление. С x64-серверами и дешевой памятью это, вероятно, очень выполнимо. В зависимости от вариантов использования, это может сделать взаимодействие более удобным, когда пользователь подключается к приложению второй раз. Можно даже подумать о предварительной загрузке кэша на стороне сервера для каждого пользователя, прежде чем пользователь запросит какой-либо календарь.