Javascript COMET запрос на загрузку - PullRequest
2 голосов
/ 05 мая 2011

Недавно я занялся проектом, который использует COMET для выполнения совместной работы и работы с простым чатом. Ребята, которые изначально написали эту вещь, создали несколько классов поверх STOMP и Oribited для обработки всех реальных разговоров, обмена сообщениями и регистрации.

Проблема в том, что если пользователь закрывает окно или переходит на другую страницу или прерывает соединение по какой-либо другой причине, всем остальным пользователям требуется некоторое время, чтобы увидеть, что он вышел из системы. Другие пользователи должны подождать, пока отметка времени последнего эхо-запроса вышедшего пользователя превысит определенную продолжительность, прежде чем он обнаружит, что пользователь больше не подключен к системе.

Решение, которое я могу придумать, требует отправки уведомления в событии onuload, которое оставил пользователь, чтобы оно уведомляло всех других пользователей, не дожидаясь истечения времени ожидания. Проблема в том, что, поскольку onunload немедленно прервет соединение, прежде чем оно будет завершено. Насколько я понимаю, это проблема и с AJAX.

Теперь я также прочитал, что синхронный запрос при выгрузке будет задерживать закрытие окна / навигацию до завершения запроса.

Итак, мои вопросы таковы: кто-нибудь знает способ временно сделать кометный запрос синхронным в выбранных случаях, чтобы у него было время завершить запрос до его завершения? Или есть другой способ решить эту проблему, о которой я не думаю? Спасибо за вашу помощь.

О, кроме того, onbeforeunload не будет работать, потому что, если он отправит запрос и пользователь выберет «Нет, я хочу остаться на этой странице», он уже уведомит других пользователей, что он вышел из чата.

tl; dr: Нужен способ успешного запуска запроса COMET в событии Unload. Мы используем STOMP и Orbited для COMET.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Функция 'onbeforeunload' создает диалог да-нет, только если из него возвращается какое-то значение.Поэтому вам нужно использовать запрос SYNCHRONOUS XMLHttpRequest (AJAX) внутри функции onbeforeunload, не возвращая ничего.И вы должны установить асинхронный флаг запроса на false , как видно из запроса AJAX GET, показанного ниже: -

  AJAXObject.open("GET", 'http://yourdomain/logout?somevar=something', false);
    AJAXObject.send(null);

Это предотвратит браузерот закрытия до завершения запроса, и, насколько я помню, Opera не поддерживает 'onbeforeunload', поэтому она не будет работать для Opera.Но он отлично работает на IE, FF, Chrome.

0 голосов
/ 05 мая 2011

Если вы используете комету, то вы должны контролировать сервер. Идея кометы заключается в том, что это не постоянный опрос сервера. У каждого клиента должно быть постоянное открытое соединение с сервером. Таким образом, когда соединение закрывается, сервер должен иметь возможность отправлять уведомления другим клиентам.

...