为了账号安全,请及时绑定邮箱和手机立即绑定

如何等待回调函数返回?

如何等待回调函数返回?

Go
BIG阳 2022-06-13 10:23:53
我有以下代码: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 的多余 response.WriteHeader 调用此外,当我在浏览器中打开“/”页面时,我看不到任何内容。如果我添加Time.Sleep()到我的代码中(参见注释行),那么我会看到内容。Exec() 代码在这里。日志显示以下内容 -cmd: 20200612192659playerExec: 20200612192659有什么方法可以等待回调函数返回吗?
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

是的,您可以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"))   

})


查看完整回答
反对 回复 2022-06-13
?
偶然的你

TA贡献1841条经验 获得超3个赞

http:来自 main.main.func1.1 的多余 response.WriteHeader 调用


如果您WriteHeader在通过Write. 这就是为什么 WriteHeader 是额外的或superfluous.


在等待你的 exec 完成时,你可以在你的闭包中使用 waitgroup 。


wg.Wait()将等到您的 exec 回调返回


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

})


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信