Heim > Backend-Entwicklung > Golang > Der Kanal sendet bei der ersten API-Anfrage keine Daten

Der Kanal sendet bei der ersten API-Anfrage keine Daten

WBOY
Freigeben: 2024-02-05 22:06:04
nach vorne
705 Leute haben es durchsucht

通道未在第一个 API 请求上发送数据

Frageninhalt

Ich habe ein SSE 端点,它将数据发送到前端,并且该数据是从另一个 API 端点检索的。我对 go 中的 channels, das noch neu ist, und es scheint, als müsste ich den API-Endpunkt zweimal auslösen, damit der SSE-Endpunkt Daten an das Frontend senden kann. Im Moment habe ich den Front-End-Code zum Herstellen einer SSE-Verbindung noch nicht geschrieben, da ich immer noch Kanäle verwende. Kann jemand erklären, warum hierfür ein zweimaliger Aufruf der API erforderlich ist, damit SSE die Daten sendet?

Shanghai Stock Exchange Route

func SendSSE(appCtx *fiber.Ctx, dataChannel chan string) error {
    appCtx.Set("Content-Type", "text/event-stream")
    appCtx.Set("Cache-Control", "no-cache")
    appCtx.Set("Connection", "keep-alive")
    appCtx.Set("Transfer-Encoding", "chunked")

    appCtx.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
        log.Println("SSE Opened")
        for {
            log.Println("Retrieving data channel..")
            fmt.Fprintf(w, "data: Message: %s\n\n", <-dataChannel)
            log.Println(<-dataChannel)

            err := w.Flush()
            if err != nil {
                // Refreshing page in web browser will establish a new
                // SSE connection, but only (the last) one is alive, so
                // dead connections must be closed here.
                fmt.Printf("Error while flushing: %v. Closing http connection.\n", err)

                break
            }

        }
    }))

    fmt.Println("SSE Closed")
    return nil

}

Nach dem Login kopieren

API zum Senden von Daten an sse

func GetApiData(appCtx *fiber.Ctx, dataChannel chan string) error {
    log.Println("Sending DataChannel data")
    dataChannel <- "Data is passed from api to sse"
    return appCtx.Status(http.StatusOK).SendString("Not Implemented")
}

Nach dem Login kopieren

Richtige Antwort


Der Grund, warum Sie das sehen, ist, dass Sie in diesem Abschnitt zwei Nachrichten verwendet haben

fmt.Fprintf(w, "data: Message: %s\n\n", <-dataChannel)
log.Println(<-dataChannel)
Nach dem Login kopieren

Jede ungerade Nachricht wird an SSE gesendet und jede gerade Nachricht wird in der Konsole protokolliert. Sollte in

geändert werden
message := <-dataChannel
fmt.Fprintf(w, "data: Message: %s\n\n", message)
log.Println(message)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDer Kanal sendet bei der ersten API-Anfrage keine Daten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage