2 回答

TA贡献1911条经验 获得超7个赞
您可以使用对象中的方法等待结果,如下所示:thenPromise
package main
import (
"fmt"
"syscall/js"
)
func main() {
wait := make(chan interface{})
js.Global().Call("sayHello", 5000).Call("then", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
fmt.Println(args[0])
wait <- nil
return nil
}))
<-wait
fmt.Println("we're done here")
}
请注意,我们正在使用一个通道在 Go 代码中实际等待。我们需要这样做,因为 Go 程序在接收来自 Javascript 的回调时必须仍在运行。
文件:index.html
<html>
<head>
<meta charset="utf-8"/>
<script src="wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
go.run(result.instance);
});
function sayHello(time) {
return new Promise(resolve => {
console.log('waiting %dms and resolving', time)
setTimeout(() => resolve('hola!'), time)
})
}
</script>
</head>
<body></body>
</html>

TA贡献1802条经验 获得超4个赞
承诺,真实的例子(去.1.18):
type DevicesData struct {
DeviceId string
GroupId string
Kind string
Label string
}
list = make([]DevicesData, 0)
end := make(chan struct{})
// golang has a bug:
// enumerateDevices() returns an array, but, go returns an object.
forEach := js.FuncOf(func(_ js.Value, args []js.Value) any {
data := DevicesData{
DeviceId: args[0].Get("deviceId").String(),
GroupId: args[0].Get("groupId").String(),
Kind: args[0].Get("kind").String(),
Label: args[0].Get("label").String(),
}
list = append(list, data)
// aways return nil
return nil
})
// promise success function
var success = js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
args[0].Call("forEach", forEach)
end <- struct{}{}
// aways return nil
return nil
})
var failure = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
err = errors.New(args[0].Get("message").String())
// aways return nil
return nil
})
js.Global().Get("navigator").Get("mediaDevices").Call("enumerateDevices").Call("then", success, failure)
// wait async call
<-end
- 2 回答
- 0 关注
- 79 浏览
添加回答
举报