Go で WebAssembly 作るときに JavaScript の requestAnimationFrame を使う方法をメモしておきます。
wasm を呼び出す JavaScript 側は通常どおり。
const go = new Go();
WebAssembly.instantiateStreaming(fetch("./main.wasm"), go.importObject).then((result) => {
go.run(result.instance);
});
Go では チャネルと無名関数を使います。
package main
import (
"syscall/js"
)
func main() {
c := make(chan struct{})
var jsCall js.Func
jsCall = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
// do something...
js.Global().Call("requestAnimationFrame", jsCall)
return nil
})
defer jsCall.Release()
js.Global().Call("requestAnimationFrame", jsCall)
<-c
}
これだけでできます。簡単ですね。