Как вызвать внешнюю функцию js из Wasm? - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь вызвать функцию javascript из Wasm.

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);
}

Как мне вызвать myFunction из кода Wasm?

Я попытался предложить предлагаемое решение, но оно выдает синтаксическую ошибку.

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

1 Ответ

3 голосов
/ 09 июля 2020

У вас есть ряд ошибок:

  • область действия функции: Global()
  • Set используется для установки свойства на js.Value, как упомянутые в docs и здесь не нужны
  • Call принимает имя функции и аргументы в качестве параметров, согласно docs
  • []js.Value, вероятно, не будет делать то, что вы хотите, если вы хотите передать массив

Ваш код go должен быть:

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

Или с однострочным, позволяя Call выполнить преобразование:

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

Вы можете обратиться к документации js .ValueOf , чтобы узнать о совместимости типов.

...