Rumah > pembangunan bahagian belakang > Golang > Saluran tidak menghantar data pada permintaan API pertama

Saluran tidak menghantar data pada permintaan API pertama

WBOY
Lepaskan: 2024-02-05 22:06:04
ke hadapan
704 orang telah melayarinya

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

Kandungan soalan

Saya mempunyai SSE 端点,它将数据发送到前端,并且该数据是从另一个 API 端点检索的。我对 go 中的 channels yang masih baharu dan nampaknya saya perlu mencetuskan titik akhir API dua kali agar titik akhir SSE menghantar data ke bahagian hadapan. Buat masa ini, saya belum menulis kod bahagian hadapan untuk mewujudkan sambungan SSE kerana saya masih menggunakan saluran. Bolehkah seseorang menjelaskan mengapa ini memerlukan panggilan API dua kali untuk mendapatkan SSE menghantar data?

Laluan Bursa Saham Shanghai

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

}

Salin selepas log masuk

API untuk menghantar data ke 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")
}

Salin selepas log masuk

Jawapan betul


Sebab anda melihat ini adalah kerana anda menggunakan 2 mesej dalam bahagian ini

fmt.Fprintf(w, "data: Message: %s\n\n", <-dataChannel)
log.Println(<-dataChannel)
Salin selepas log masuk

Setiap mesej ganjil dihantar ke SSE dan setiap mesej genap dilog masuk ke konsol. Hendaklah ditukar kepada

message := <-dataChannel
fmt.Fprintf(w, "data: Message: %s\n\n", message)
log.Println(message)
Salin selepas log masuk

Atas ialah kandungan terperinci Saluran tidak menghantar data pada permintaan API pertama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan