javascript - 使用 go 和 Otto 调用 javascript 回调函数

标签 javascript go

如何使用 Otto 调用作为参数传递的 javascript 函数(作为回调函数)?

示例 javascript:

test.testCallback(function(a) { console.log(a) });

使用 Otto 的示例代码:

func main() {
    motto.AddModule("test", testModuleLoader)
    vm := motto.New()
    vm.Run("test.js")
}

func testModuleLoader(vm *motto.Motto) (otto.Value, error) {
    test, _ := vm.Object(`({})`)
    test.Set("testCallback", func(call otto.FunctionCall) otto.Value {
        fn := call.Argument(0)
        // HOW TO CALL fn("value for a") ?
        return fn
    })

    return vm.ToValue(test)
}

最佳答案

是的,这是可能的,尽管此时我只是通过包装在对象中的回调来完成它。所以你的代码看起来像这样:

func main() {
    motto.AddModule("test", testModuleLoader)
    vm := motto.New()
    vm.Run("test.js")
}

func testModuleLoader(vm *motto.Motto) (otto.Value, error) {
    test, _ := vm.Object(`({})`)
    test.Set("testCallback", func(call otto.FunctionCall) otto.Value {
        fnWrapper := call.Argument(0).Object()

        // HOW TO CALL fn("value for a") ?
        cb, _ := fnWrapper.Get("cb")
        if cb.IsFunction() {
          cbArgs := "value for a"
          return fnWrapper.Call("cb", cbArgs) // cbArgs is optional
        }

        return motto.NullValue()
    })

    return vm.ToValue(test)
}

关于javascript - 使用 go 和 Otto 调用 javascript 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41500997/

相关文章:

javascript - 如何在内容脚本中使用 Flowplayer 函数?

javascript - 如何在 $scope 中的两个变量之间设置双向绑定(bind)

javascript - 在 cordova ios build 上添加 iTunesArtwork 和 iTunesArtwork@2

javascript - 我们可以向 Alfresco 社区版添加自定义 javascript 和 css 吗?

javascript - if 语句和 return var === SomethingElse

go - 突然,用于语音到文本的 Go 语言 Google Cloud API 无法正常工作!/lib64/libc.so.6 : version `GLIBC_2.32' not found

postgresql - 无法使用 Golang Gorm 连接到 RDS Postgres

c# - Golang - DTO、实体和映射

go - Go 语言中的引用类型令人困惑

go - 对于给定的接口(interface),我有三个实现。三个实现如何共享相同的方法?