2016-10-28 6 views
1

Я довольно новичок в 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 секунд по какой-то причине.

Любая помощь будет оценена! Благодаря!

ответ

1

Как насчет закрытия соединения с помощью source.close(); после запуска в первый раз?

+0

Это действительно кажется возможным. Из моего исследования я вижу, что это особенность браузера, пытающегося сохранить соединение с сервером. Поэтому мне нужно либо отключить функцию автоматического повторного подключения, либо поймать конец потока, чтобы вручную закрыть соединение с клиентом. Есть ли способ, событие, чтобы сделать это? Или мне нужно отправить конкретное сообщение? – Ours

+0

Попробуйте использовать 'eventSource.onerror = function (e) { if (this.readyState == EventSource.CONNECTING) {this.readyState == EventSource.CONNECTING}' на стороне клиента. Когда ваше соединение окончено, ваш браузер, похоже, пытается его восстановить, и в этом случае вы можете сделать свою работу. –

+0

Извините, в моем последнем комментарии есть опечатка. Я имел в виду: eventSource.onerror = function (e) {if (this.readyState == EventSource.CONNECTING) {clos ...}} –