Я пытаюсь сделать консоль с помощью sse, которая показывает клиенту, что делает сервер. В настоящее время он делает то, что я хочу, за исключением задержки (около 2 секунд). Я добавил http.Flusher, но, похоже, он абсолютно ничего не делает. Я вызываю UpdateLogMessage с помощью горутин: go UpdateLogMessage("Example")
ССЭ:
type Upl struct {
log string
}
var Log chan *Upl
func DashboardHandler(w http.ResponseWriter, r *http.Request) {
f, ok := w.(http.Flusher)
if !ok {
fmt.Println("Streaming unsuported")
}
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
msg := <-Log
fmt.Fprintf(w, "data: %v\n\n", msg.log)
f.Flush()
}
//Updates log message with curent time and message content
func UpdateLogMessage(msg string) {
curentTime := time.Now().Format("15:04:05")
ul := fmt.Sprintf("<%v> %v", curentTime, msg)
up := &Upl{
log: ul,
}
Log <- up
}
func MakeChan() {
Log = make(chan *Upl)
}
Javascript:
function onLoaded(){
var source = new EventSource("sse/dashboard")
var logg = "";
var currentmsg = "";
source.onmessage = function (event){
var dashboard = event.data;
//If message changed print it to console
if (dashboard != currentmsg){
console.info("OnMessage called:");
console.dir(event);
currentmsg = dashboard;
logg += currentmsg + "<br/>";
console.info(logg);
document.getElementById("console").innerHTML = logg;
}
}
}
И если клиент не прослушивается, вы будете сливать горутины с go UpdateLogMessage("Example"), так как они не смогут отправить на канал и, таким образом, зависнут навсегда. Посмотрите на этот пример: Почему выполнение Golang http.ResponseWriter задерживается?
Спасибо! Задержка, вероятно, произошла из-за того, что с каждым сообщением я возвращался из обработчика, как вы сказали. Теперь я изменил это, добавив цикл, поэтому он должен работать нормально, но поскольку я использую форму загрузки, когда я начинаю загружать файл, HTTP-соединение закрывается, и я получаю 0 сообщений во время загрузки. Мне, вероятно, нужно использовать Ajax для загрузки файлов, чтобы он работал правильно.

Размещенный вами код не объясняет задержки, но SSE используется не так (или не должен использоваться). Вы возвращаетесь из обработчика после отправки первого сообщения. Обычно обработчики SSE имеют цикл для отправки обновлений клиенту. Кроме того, способ получения из канала
Logопасен, если несколько клиентов подключатся к конечной точке SSE, они будут соревноваться за получение сообщения, и вы не сможете обрабатывать отмену контекста.