第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

服務(wù)器發(fā)送事件意外行為

服務(wù)器發(fā)送事件意外行為

Go
慕田峪7331174 2022-06-21 10:01:35
我正在嘗試在我的 Golang 服務(wù)器和 VueJS 之間設(shè)置一個(gè)基本流。我按照StackOverflow上的另一篇文章開(kāi)始。但是,由于某些奇怪的原因,當(dāng)我在 chrome 中檢查控制臺(tái)時(shí),輸出會(huì)不斷重復(fù)(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 的新手,但我認(rèn)為客戶(hù)端等待來(lái)自服務(wù)器的響應(yīng)。我的期望是,一旦 Gin 流結(jié)束,客戶(hù)端就會(huì)一直等待并且在我執(zhí)行 EventSource.close() 之前什么都不做。輸出似乎服務(wù)器正常發(fā)送響應(yīng),但一旦流結(jié)束客戶(hù)端繼續(xù)發(fā)出請(qǐng)求?我不確定。有人可以指出我做錯(cuò)了什么嗎?謝謝
查看完整描述

1 回答

?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊

你沒(méi)有錯(cuò),其實(shí)。這是 api 的預(yù)期功能EventSource,它總是觸發(fā)調(diào)用,除非它明確停止。檢查事件源 API


EventSource 接口是 Web 內(nèi)容與服務(wù)器發(fā)送事件的接口。EventSource 實(shí)例打開(kāi)與 HTTP 服務(wù)器的持久連接,該服務(wù)器以文本/事件流格式發(fā)送事件。連接保持打開(kāi)狀態(tài),直到通過(guò)調(diào)用 EventSource.close() 關(guān)閉。


因此,您需要在服務(wù)器完成發(fā)送數(shù)據(jù)時(shí)進(jìn)行更新,并讓客戶(hù)端知道流是否已停止。這是您的代碼中的示例:


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);

        }

    });


查看完整回答
反對(duì) 回復(fù) 2022-06-21
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)