Я довольно новичок в ServerSend Events, используя js и HTML5. У меня есть базовая настройка с моей страницей, вызывающей API, API выполняет командную строку, и я пытаюсь отобразить результат этого вызова в реальном времени (api вызывает скрипт на сервере, и я обслуживаю консольный выход).HTML5/Javascript SSE limit number of calls
Моя проблема в том, что если страница остается открытой, API продолжает называться. Я хотел бы остановить это поведение и вызвать API только один раз. Я попытался использовать логическое значение, чтобы определить источник события только один раз, но не повезло.
Вот мой JS код:
function liveExec($scenarioId){
var $run = true;
if ($run)
{
var source = new EventSource('/run/'+$scenarioId+'/1');
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "<br>";
};
$run= false;
}
}
Функция вызывается с помощью кнопки. Вот мой доступ Log:
127.0.0.1 - - [28/Oct/2016:11:09:06 +0200] "GET /run/1/1 HTTP/1.1" 200 2318
127.0.0.1 - - [28/Oct/2016:11:09:31 +0200] "GET /run/1/1 HTTP/1.1" 200 2318
127.0.0.1 - - [28/Oct/2016:11:09:56 +0200] "GET /run/1/1 HTTP/1.1" 200 2318
127.0.0.1 - - [28/Oct/2016:11:10:21 +0200] "GET /run/1/1 HTTP/1.1" 200 2318
127.0.0.1 - - [28/Oct/2016:11:10:47 +0200] "GET /run/1/1 HTTP/1.1" 200 2317
Визуально функция вызывается каждые 25 секунд по какой-то причине.
Любая помощь будет оценена! Благодаря!
Это действительно кажется возможным. Из моего исследования я вижу, что это особенность браузера, пытающегося сохранить соединение с сервером. Поэтому мне нужно либо отключить функцию автоматического повторного подключения, либо поймать конец потока, чтобы вручную закрыть соединение с клиентом. Есть ли способ, событие, чтобы сделать это? Или мне нужно отправить конкретное сообщение? – Ours
Попробуйте использовать 'eventSource.onerror = function (e) { if (this.readyState == EventSource.CONNECTING) {this.readyState == EventSource.CONNECTING}' на стороне клиента. Когда ваше соединение окончено, ваш браузер, похоже, пытается его восстановить, и в этом случае вы можете сделать свою работу. –
Извините, в моем последнем комментарии есть опечатка. Я имел в виду: eventSource.onerror = function (e) {if (this.readyState == EventSource.CONNECTING) {clos ...}} –