Javascript стеки - это асинхронное взаимодейсвие php бекенда с js фронтендом. Вы устанавливаете в php бекенде js задачу(код), помещаете его в стек, устанавливая таймаут выполнения кода, и опционально ключ в стеке во избежание дублирования задачи. Код выполняется спустя заданный таймаут, удаляясь из стека и устанавливается следующий таймаут, если задачи ещё остались в стеке.
Синтаксис добавления задач в стек определён статическим методом StackJS::add($code, $timeout = 0, $key = '')
Выполнение и установка очередных таймаутов обеспечивается методом StackJS::execute() и запросами к /api/action/stackjs
При загрузке любой страницы выполняется метод StackJS::execute(), который добавляет в код страницы javascript, время выполнения которого в стеке истекло. При этом код удаляется из стека. А также, если в стеке ещё остались задачи, время которых не истекло, то в код страницы добавляется функция с самым минимальным таймаутом из стека задач, которая запросит /api/action/stackjs спустя этот таймаут. Этот запрос к api снова вернёт StackJS::execute() и т.д. пока стек не закончится.
Есть также отдельно метод StackJS::set() который не выполняет js код, а возвращает только функцию с таймаутом запроса к /api/action/stackjs
Итак, добавим на страницу
И спустя 30 секунд после её загрузки увидим всплывающее сообщение. А если мы спустя 10 секунд уйдем на другую страницу, то там оно покажется уже через 20 секунд. А если мы перезагрузим эту страницу, до выполнения js кода из стека, то код и таймаут в стеке обновятся, и повторно, т.е. дважды данный код выполнен не будет, благодаря уникальному ключу key-stack-test. Если нужно изменить это поведение - просто не задавайте уникальный ключ элементу стека.
Посмотрите, что автоматически добавила нам система в страницу, увидев в стеке отложенную задачу:
То есть, для реализации, мы не делаем постоянных ежесекундных ajax запросов к бекенду, нагружая тем самым сервер, до состояния кипящего чайника. Кстати так делают именно чайники;) Мы делаем запросы тогда, и только тогда, когда они необходимы!
Наглядно проедмонстрируем это в цикле, на той же странице добавим:
Посмотрите что добавилось при загрузке:
А затем обработчик /api/action/stackjs каждый последующий раз добавлял очередной код выполнения и очередной таймаут запроса к себе же, пока стек не закончился.
Пунктуально поздравим наших пользователей с Новым Годом, секунда в секунду(если он конечно будет на странице, а если у него сохранится сессия, то он увидит поздравление позже):
Усложняем задачи. Пример простейшей рекурсии, которая размещается и стартует при запросе к /api/action/my-any-action выполняясь каждые 5 секунд:
Теперь нам достаточно лишь однажды вызвать javascript действие /api/action/my-any-action и код будет выполняться на сайте бесконечно, пока мы не убьем свою сессию
Но давайте уже будем работать с wrong-mvc как положено, ведь у нас есть специальные триггеры действий, которые активируют тоже самое поведение:
или же с подтверждающим окошком
Вот ещё пример применения на странице: