2017-01-06 13 views
1

Ottoをコールバック関数としてパラメータとして渡したjavascript関数を呼び出すにはどうすればよいですか?goとOttoを使ってjavascriptコールバック関数を呼び出す

例のjavascript:

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

例はオットーを使用してコードを行く:

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

答えて

0

この時点で、私は唯一のオブジェクトにラップコールバックでそれをやったが、はい、これは、可能です。したがって、コードは次のようになります。

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) 
} 
関連する問題