亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

服務器發送事件意外行為

服務器發送事件意外行為

Go
慕田峪7331174 2022-06-21 10:01:35
我正在嘗試在我的 Golang 服務器和 VueJS 之間設置一個基本流。我按照StackOverflow上的另一篇文章開始。但是,由于某些奇怪的原因,當我在 chrome 中檢查控制臺時,輸出會不斷重復(0、1、2、3、4 -short stop- 0、1、2、3、4 -short stop- 等)。這是我的代碼main.go  package main  import (    "io"    "time"    "github.com/gin-contrib/static"    "github.com/gin-gonic/gin"  )    func main() {        r := gin.Default()        r.GET("/stream", func(c *gin.Context) {            chanStream := make(chan int, 2)            go func() {                defer close(chanStream)                for i := 0; i < 5; i++ {                    chanStream <- i                    time.Sleep(time.Second * 1)                }            }()            c.Stream(func(w io.Writer) bool {                if msg, ok := <-chanStream; ok {                    c.SSEvent("message", msg)                    return true                }                return false            })        })        r.StaticFile("/", "./public.html")         r.Use(static.Serve("/", static.LocalFile("./public.html", true)))        r.Run()  }公共.html<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title></title></head><body><script>var stream = new EventSource("/stream");stream.addEventListener("message", function(e){    console.log(e.data);});</script>    </body></html>我是 SSE 和 Vue 的新手,但我認為客戶端等待來自服務器的響應。我的期望是,一旦 Gin 流結束,客戶端就會一直等待并且在我執行 EventSource.close() 之前什么都不做。輸出似乎服務器正常發送響應,但一旦流結束客戶端繼續發出請求?我不確定。有人可以指出我做錯了什么嗎?謝謝
查看完整描述

1 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

你沒有錯,其實。這是 api 的預期功能EventSource,它總是觸發調用,除非它明確停止。檢查事件源 API


EventSource 接口是 Web 內容與服務器發送事件的接口。EventSource 實例打開與 HTTP 服務器的持久連接,該服務器以文本/事件流格式發送事件。連接保持打開狀態,直到通過調用 EventSource.close() 關閉。


因此,您需要在服務器完成發送數據時進行更新,并讓客戶端知道流是否已停止。這是您的代碼中的示例:


main.go


        go func() {

            defer close(chanStream)

            for i := 0; i < 5; i++ {

                chanStream <- i

                time.Sleep(time.Second * 1)

            }

        }()

        c.Stream(func(w io.Writer) bool {

            if msg, ok := <-chanStream; ok {

                if msg < 4 {

                    c.SSEvent("message", msg)

                } else {

                    c.SSEvent("message", "STOPPED")

                }

                return true

            }

            return false

        })

公共.html


    stream.addEventListener("message", function(e){

        if (e.data === "STOPPED") {

            console.log("STOP");

            stream.close();

        } else {

            console.log(e.data);

        }

    });


查看完整回答
反對 回復 2022-06-21
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號