在 go 函数中等待 js 异步函数(promise)
await js async function (promise) inside a go function
我希望将 indexdb 集成到基于 wasm 的应用程序中。您如何在 go 函数中“等待”来自 js 函数的承诺。这是例子
async getItem(key) {
try{
const out = await database.getItem(key);
return out;
}catch(err){
return null;
}
}
进行中
func Get(key string)[]byte{
found := js.Global().Get("Store").Call('getItem', key )
// await for found
// convert js.Value to to []byte
return nil
}
异步回调也很好。
LE:一个糟糕的解决方案是创建一个带有无限循环的 go 例程,等待 DOM 变量存在,例如要设置的 global.solution+ID。但我认为这是一个糟糕的解决方案
您可以使用 Promise
对象中的 then
方法来等待结果,如下所示:
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>
我希望将 indexdb 集成到基于 wasm 的应用程序中。您如何在 go 函数中“等待”来自 js 函数的承诺。这是例子
async getItem(key) {
try{
const out = await database.getItem(key);
return out;
}catch(err){
return null;
}
}
进行中
func Get(key string)[]byte{
found := js.Global().Get("Store").Call('getItem', key )
// await for found
// convert js.Value to to []byte
return nil
}
异步回调也很好。
LE:一个糟糕的解决方案是创建一个带有无限循环的 go 例程,等待 DOM 变量存在,例如要设置的 global.solution+ID。但我认为这是一个糟糕的解决方案
您可以使用 Promise
对象中的 then
方法来等待结果,如下所示:
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>