如何从 Wasm 调用外部 js 函数?

How to call an external js function from Wasm?

我正在尝试从 Wasm 调用 javascript 函数。

package main

import (
    "syscall/js"
)

func main(){
   var args []js.Value
   // set args here...
   js.Global().Get("document").Call("function", "myFunction").Set("args", args)
}

然后在 HTML 我会包括我的 javascript

<script src="./js/scripts.js"></script>

其中 js/script.js 包含:

function myFunction(args){
   console.log(args);
}

如何从 Wasm 代码调用 myFunction?

我尝试了建议的解决方案,但出现语法错误。

args := js.ValueOf([]interface{"foo", 42})
v := js.Global().Call("myFunction", args)
fmt.Println(v)

终端看起来像

$ GOOS=js GOARCH=wasm go build -o ./ipickd.wasm ./wasm.go
# command-line-arguments
./wasm.go:44:33: syntax error: unexpected literal "foo", expecting method or interface name

您有一些错误:

  • 函数的范围是Global()
  • Set用于在js.Value上设置属性,如docs中所述,此处不需要
  • Call 根据 docs
  • 将函数名称和参数作为参数 如果你想传递一个数组,
  • []js.Value 可能不会做你想做的事

你的代码应该是:

args := js.ValueOf([]interface{}{"foo", 42})
js.Global().Call("myFunction", args)

或者使用一行代码,让 Call 进行转换:

js.Global().Call("myFunction", []interface{}{"foo", "42"})

您可以参考 js.ValueOf 类型兼容性文档。