Как вынести расчёт из JavaScript?

Здравствуйте.
Предположим гипотетическую ситуацию:
Есть форма заказа товара. Стоимость этого товара зависит от введённых данных и вычисляется по определённой формуле. На форме, при вводе данных, тут же отображается итоговая стоимость. Но после отправки формы на сервер, нам нужно снова, используя такую же формулу, подсчитать стоимость. Это приводит нас к тому, что формула должна быть прописана как в скрипте JS, так и в клиентском скрипте. Однако, это очень неудобно для поддержки.

Существуют ли решения, позволяющие прописывать формулу в одном месте приложения?

Думал о AJAX или WebSocket, но подобное решение грузит сервер и обладает низкой отзывчивостью.
  • Вопрос задан
  • 1403 просмотра
Пригласить эксперта
Ответы на вопрос 6
@xutesayor
Это нормальная практика дублировать серверную логику на клиенте для ускорения. Php и js очень похожие языки, и если у вас чистая функция без побочных эффектов то ее не составит труда перенести на php.
Ответ написан
@Arik
изоморфный код приложения -NodeJS?
а так на серверной стороне в любом случаи надо по новой считать и если там не JS, то только поддерживать два кода. Можно еще аяксами, просто расчет запрашивать не с каждого пука, а с какой-то задержкой.
Ответ написан
victorzadorozhnyy
@victorzadorozhnyy
сделайте по rest api запрос расчета на стороне сервера
Ответ написан
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Да, у тебя расчет выполняет модель в PHP, а из яваскрипта ты делаешь запрос к этому расчету аяксом.

Главное чтобы твой аякс не вызывал загрузку всего сайта, а просто делал расчет, тогда все будет ну оччень быстро. Как можно это понять - сделай запрос на несуществующий URL - если сайт не подрубается - ты получишь ответ "сервер не отвечает" или стандартный .htaccess-ный Forbidden, а если подрубается - то это будет генерация страницы типа "такой страницы нету".

К примеру сравнить и рассчитать 2000 товаров, запросив сохранив результаты в гугл докс по ходу, и получив справочники из того же гугл докс, и все это выдав в виде json массива, сохранив кеши - занимает чуть больше 10 сек, и это без использования быстрых функций - просто чем было написано.

Если не подгружать весь фреймворк, чтобы вызвать действие "рассчитать", а работать с существующей базой из кеша товаров по ценам - расчет будет мгновенно делаться и не будет так набившего оскомину "лоадера" на 10 секунд расчета трех товаров из корзины. Впрочем точный запрос по id товаров в базу отработает так же быстро, если его написать с нужными join-ами, а не "запрос-запрос-запрос-объединить на PHP-рассчитать-объединить-запрос-проверить".

Впрочем, можно и действительно на ноде какой-нибудь. Главное помнить, что когда расчет делает сервер - он в работе, то есть нагрузка, когда расчет делает клиент - он может прислать тебе хрень разную (хакеры, да да), которую ты никак не проверишь, не произведя расчет на сервере.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Если формулы не очень сложные, то можно переписать их так, что код в js и php был полностью одинаковый.
К примеру:
function calc($a, $b, $c, $result = 0) {
   $result = $a + $b;
   $result = $result * $c;
   return $result;
}


Это будет одинаково работать и в js и в php.
Такие формулы можно держать в одном месте и инклудить их и в php и в js.
Конечно, если нужны более сложные вычисления, чем простейшая арифметика, типа вызовов sin() в php, а в js это уже Math.sin(), то придется писать дополнительные врапперы.
Ответ написан
SorokinWS
@SorokinWS Автор вопроса
Судя по всему, готовых решений не существует - иначе сразу был бы ответ.
Вариантов решения вижу 2
1. Запрос через AJAX или приложение на WebSocket - минусы есть, но поддержка проще. И при должной оптимизации нормально работает.
2. генерация дублирующегося кода в автоматическом режиме. Тоесть формула может быть описана в конфиге, и просто использоваться при расчёте на сервере. А JS файлы пересобираются после внесения изменений.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы