我有以下代码:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
player.Exec(command, func(response map[string]interface{}){
if response["statusCode"]==float64(0) { // ok
w.Write([]byte(response["statusMessage"].(string)))
player.SendMessage("<b>"+response["statusMessage"].(string)+"</b>")
fmt.Println("playerExec: "+time.Now().Format("20060102150405"))
} else { // failed to process
w.WriteHeader(http.StatusBadRequest) // 400
w.Write([]byte(response["statusMessage"].(string)))
player.SendMessage(response["statusMessage"].(string))
}
})
// Time.Sleep(Time.Seconds*2)
fmt.Println("cmd: "+time.Now().Format("20060102150405"))
})
player.Exec()
的处理需要一些时间(因为它启动了WebSocket连接),因此回调函数会在一段时间后被调用(请参见下面的证明)。已经晚了,所以我看到以下错误:
http:多余的响应。来自main.main.func1.1的WriteHeader调用
而且,当我在浏览器中打开'/'页面时,我看不到任何内容。如果我在代码中添加Time.Sleep()
(请参见注释行),那么我看到的内容。Exec()代码为here。
日志显示以下内容-
cmd: 20200612192659
playerExec: 20200612192659
有什么方法可以等待回调函数返回吗?
是,您可以如下使用sync.WaitGroup
:
wg := sync.WaitGroup{}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
wg.Add(1) // add a waitgroup before calling the async function
player.Exec(command, func(response map[string]interface{}){
defer wg.Done() // release when this function returns
if response["statusCode"]==float64(0) { // ok
w.Write([]byte(response["statusMessage"].(string)))
player.SendMessage("<b>"+response["statusMessage"].(string)+"</b>")
fmt.Println("playerExec: "+time.Now().Format("20060102150405"))
} else { // failed to process
w.WriteHeader(http.StatusBadRequest) // 400
w.Write([]byte(response["statusMessage"].(string)))
player.SendMessage(response["statusMessage"].(string))
}
})
wg.Wait() // this will block until all the resources are released
fmt.Println("cmd: "+time.Now().Format("20060102150405"))
})
http:多余的响应。来自main.main.func1.1的WriteHeader调用
已经通过WriteHeader
向响应中写入内容后,如果执行Write
,将会看到此信息。这就是WriteHeader额外或superfluous
的原因。
在等待执行结束时,可以在闭包中使用waitgroup。
[wg.Wait()
将等待,直到您的执行回调返回
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
var wg sync.WaitGroup
wg.Add(1)
player.Exec(command, func(response map[string]interface{}){
defer wg.Done()
if response["statusCode"]==float64(0) { // ok
w.Write([]byte(response["statusMessage"].(string)))
player.SendMessage("<b>"+response["statusMessage"].(string)+"</b>")
fmt.Println("playerExec: "+time.Now().Format("20060102150405"))
} else { // failed to process
w.WriteHeader(http.StatusBadRequest) // 400
w.Write([]byte(response["statusMessage"].(string)))
player.SendMessage(response["statusMessage"].(string))
}
})
wg.Wait()
// Time.Sleep(Time.Seconds*2)
fmt.Println("cmd: "+time.Now().Format("20060102150405"))
})