Суть такая:
Пишу WEB приложение, использую NodeJS в связке с AngularJS.
Проблема вот в чем, отправляю Ajax запрос на сервер, и он там хранится(на сервере) до выполнения какого либо действия ( может пройти неизвестно сколько времени ), и если допустим я ухожу со страницы где посылается запрос, а потом опять возвращаюсь, то запрос отправляется вновь. Но старый запрос все еще хранится на сервере. И соответсвенно при выполнение нужного мне действия, срабатывает обработчик события который многократно отправляет ответ ( многократно - количество обновлений страницы т.е посылки запроса ), из которых то только один нужный. Так вот, как можно так сказать избавиться от всех ненужных запросов которые хранятся на сервере? Надеюсь доступно обьяснил.
Всм в базе данных ?! Я посылаю запрос на сервер, вызывается функция которая принимает req, а дальнейший алгоритм работы зависит от обработчика события, которое может в любой момент вызваться. т.е функция хранит в себе request, пока не выполнится некоторое событие. После срабатывания обработчика, я отправляю ответ на этот запрос, но может случится такое что запрос на клиенте уже оборван, и получается он отправляет ответ в пустоту.
Каждое обновление страницы, создается экземпляр функции checkChat, а когда успешно проходит функция putMessage, вызывается событие push, которое и ожидается в checkChat, а т.к экземлпяров ее уже хранится дохера, он и пытается отправить ответ много раз.
Евгений Николаев: я понял для чего вы это делаете. Один из запросов обрабатывает входящее сообщение, которое заносится в базу данных и затем отправляется всем клиентам. Но это делается не так. Вы построили неправильную архитектуру.
Евгений Николаев: Во первых создайте поле client_ids в базе в таблице сообщений. Пусть клиент генерирует его сам на своей стороне, но только один раз. Или пусть сервер ему отправляет id в виде куков. При каждом запросе он должен отправлять свой id. Когда от клиента приходит запрос на новые сообщения отправляйте ему массив сообщений из базы, но не все, а только те, что еще не прочитаны им. Как узнать, прочитал он конкретное сообщение или нет? А вот тут как раз поможет поле client_ids в таблице сообщений. Перебираете client_ids и если там нет его id то, значит сообщение для него новое.
Вообще стоит уйти от лонгпула и от долгих запросов
Но если речь не о долго выполняемом запросе , а о запросе, который приходит собфтийно, лучше посмотреть в сторону сокетов