我需要一个不断更新的前端HTML表,从后端获取它的数据。下面是我的golang后端生成一个随机数,将其放入一个结构体中,然后将该结构体追加到一个结构体切片中,并使用Server Sent Events将其带到前端:
这样做的结果应该是一堆结构的一个长切片。我希望这是在前端,其中结构体的切片是整个表,切片中的每个结构体是HTML表中的一行。
type sliceofRand struct {
Items []randomData
}
var sliceofRandvar sliceofRand
func formatServerSentEvent(event string, data any) (string, error) {
m := map[string]any{
"data": data,
}
buff := bytes.NewBuffer([]byte{})
encoder := json.NewEncoder(buff)
err := encoder.Encode(m)
if err != nil {
return "", err
}
sb := strings.Builder{}
sb.WriteString(fmt.Sprintf("event: %s\n", event))
sb.WriteString(fmt.Sprintf("data: %v\n\n", buff.String()))
return sb.String(), nil
}
func SseHandler(w http.ResponseWriter, r *http.Request) {
flusher, ok := w.(http.Flusher)
if !ok {
http.Error(w, "SSE not supported", http.StatusInternalServerError)
return
}
fmt.Println("Request received for price...")
w.Header().Set("Content-Type", "text/event-stream")
priceCh := make(chan sliceofRand)
go func() {
for {
number := rand.Intn(100)
view := randomData{
Number: number,
Info: "Random number",
}
sliceofRandvar.Items = append(sliceofRandvar.Items, view)
priceCh <- sliceofRandvar
time.Sleep(3 * time.Second)
}
}()
for price := range priceCh {
event, err := formatServerSentEvent("price-update", price)
if err != nil {
fmt.Println(err)
break
}
_, err = fmt.Fprint(w, event)
if err != nil {
fmt.Println(err)
break
}
flusher.Flush()
}
}
正如你所看到的,我有一个函数,它将数据作为服务器发送事件发送到前端,每次我在一个单独的goroutine中生成一个新的随机数时,我都会将新的结构体追加到一个结构体列表中,并调用SSE函数并创建一个新的SSE。现在我的问题是,我在前端得到这个,我想把所有东西都放进一个HTML表。
以下是我在前端看到的SSE输出:
{"data":{"Items":[{"Random_Number":14,"Something":"this_is_something"},
{"Random_Number":88,"Something":"this_is_something"}]}}
1条答案
按热度按时间hgqdbh6s1#
我不知道你在前端使用什么;它是一个框架还是一个简单的HTML模板?
让我们假设你有一个简单的html表:
<table> <tbody id="rows"></tbody></table>
你可以在获取数据的JavaScript脚本函数中像这样使用JQuery: