Я работаю над приложением AJAX в реальном времени с длительным опросом в NodeJS. Я хотел бы определить, когда пользователь закрывает вкладку с ожидающим длинным запросом. Я использую событие закрытия соединения NodeJS:
request.connection.on('close', function () {
console.log(request.url);
...
});
Цикл AJAX выглядит следующим образом:
var EventLoop = new (function () {
var self = this;
this.listen = function () {
$.postJSON(
'recieve-events',
{ /* some data not important for this issue */ },
function (data) {
...
self.listen();
}
);
}
})();
Вот как определяется функция postJSON:
$.extend({
postJSON: function (url, data, callback) {
$.ajax({
'url': url,
'dataType': 'json',
'data': data,
'type': 'POST',
'success': callback
});
}
});
Проблема в том, что событие закрытия соединения вызывается дважды, когда я закрываю вкладку. Может кто-нибудь объяснить мне, почему и как предотвратить такое поведение?
Я знаю, что могу использовать счетчик и вызывать функцию обратного вызова только в первый раз, но я не считаю это хорошим решением, поскольку для меня нет логического смысла закрывать что-то, что уже закрыто , (запуская событие дважды)