Pisałem z tym problemem zarówno na stackoverflow, jak i na reddcie, ale raczej nie doczekam się odpowiedzi. Podejmuję ostatnią próbę tutaj, bo bardzo nie chciałbym przepisywać tego projektu na jakiś javascript, czy inny php, ale chyba będę musiał. Więc sprawa dotyczy, jak wskazuje tytuł wątku, użycia kontekstu. Chodzi o to, że chcę przerwać przetwarzanie requesta, po tym jak użytkownik odświeży lub opuści stronę. W poprzednim projekcie użyłem takiego kodu: (przy wykorzystaniu frameworku gin)
respChan := make(chan types.Result)
defer close(respChan)
cCp := c.Copy()
go func() {
for {
fmt.Println("check")
time.Sleep(10000 * time.Millisecond) //long task
test := []types.ResultTXT{{Txt: "Test Resp"}}
select {
case <-cCp.Done():
fmt.Println("goroutine canceled")
return
case respChan <- types.Result{Response: test}:
fmt.Println("Work end")
return
}
}
}()
select {
case <-c.Done():
fmt.Println("canceled")
c.Abort()
return
case res := <-respChan:
result := res.Response
c.HTML(http.StatusOK, "response.html", gin.H{
"Resp": result,
})
return
}
I to działało (i działa) jak należy.
W nowym projekcie zastosowałem dokładnie to samo, właściwie skopiowałem po prostu ten kod, ale nie działa. Od 2 dni nie mogę dojść dlaczego. Modyfikowałem go już chyba na wszelkie możliwe sposoby, ale bez skutku. Użyłem innego frameworka (fiber) i też nic. Nie mam już pomysłu, co tutaj jest źle. Zastanawiam się, czy frontend może wpływać na poprawne działanie kontekstu? Jest to html + proste funkcje js do zmieniania zakładek i rozwijania menu + htmx do wysyłania requestów. Jeśli brakuje jakiś informacji, dostarczę wszelkie potrzebne, żeby tylko się z tym uporać. Ewentualnie, czy istniej jakiś inny sposób na monitorowanie tego, czy użytkownik dalej jest na stronie lub nie wykonał jakiejś inne akcji? Przy okazji chciałem też dopytać, czy używanie goroutyny w handlerze jest w ogóle potrzebne? Z tego co czytałem, to każdy handler jest i tak startowany w osobnej, więc nie wiem czy to ma sens?