小编典典

Flush()不起作用

go

请检查这个要点并告诉我,怎么了?
为什么我看不到我的留言?
要点:https :
//gist.github.com/cnaize/895f61b762a9f5ee074c

如果简单,我有两个功能:

func send(param martini.Params, r render.Render) {
    Ct.Msgs <- param["msg"]

    fmt.Printf("Sent: %v", param["msg"])

    r.JSON(http.StatusOK, Response{"status": "ok"})
}

watch功能:

func watch(rw http.ResponseWriter, r render.Render) {
    var msg string
    ok := true
    for ok {
        select {
        case msg, ok = <-Ct.Msgs:
            rw.Write([]byte(msg))
            fmt.Printf("Wrote: %v", msg)
            f, ok := rw.(http.Flusher)
            if ok {
                f.Flush()
                fmt.Println("Flushed")
            } else {
                r.JSON(http.StatusOK, Response{"status": "error", "descr": "CANT_FLUSH"})
                return
            }
        }
    }

    r.JSON(http.StatusOK, Response{"status": "ok", "descr": "finished"})
}

为什么不起作用?

编辑:

我已经更新了要点。现在在哪里:

if i, err := rw.Write([]byte(msg)); err != nil {
    r.JSON(http.StatusOK, Response{"status": "error", "descr": err.Error()})
    return
} else {
    fmt.Printf("i: %v", i)
}

我在日志中:

 Sent: hello
 i: 5
 Wrote: hello
 Flushed

但是我什么也没看到。

有任何想法吗?


阅读 231

收藏
2020-07-02

共1个答案

小编典典

冲洗工作正常。问题是Chrome的纯文本呈现器在显示任何内容之前会等待完整的响应正文。强制将内容类型设置为html以查看增量响应:

func watch(rw http.ResponseWriter, r render.Render) {
    rw.Header().Set("Content-Type", "text/html")
    // same code as before
}
2020-07-02