2013-05-10 21 views
1

我正在使用javax.script将JavaScript代码嵌入到Java方法中。javax.script传递给JavaScript用作回调的Java方法

在我的项目中,JavaScript负责通过websocket发送异步http请求。一旦收到响应,我需要执行回调函数。

我想调用一个用Java编写的方法作为回调。

在此处的文档中:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/ 它解释了如何在JavaScript中为接口实现java方法,但不是如何调用Java方法形式的javascript。

感谢

回答

1

不知道这是你正在寻找什么,但这里是一个代码示例,提供了一个Java对象回调到一些JavaScript代码,然后将回拨该回调后:

public class JsCallback{ 
    public static void main(String[] args) throws Exception{ 

    ScriptEngineManager factory = new ScriptEngineManager(); 
    ScriptEngine engine = factory.getEngineByName("JavaScript"); 
    engine.put("cb", new JsCallback()); 
    engine.eval("println('Doing something in javascript here first');" + 
    "cb.apply('bar');"); 
    } 

    public void apply(String s){ 
    System.out.println("Back in java code here: " + s); 
    } 
} 
+0

嗨cmbaxter!我不确定。在我的项目中,我将调用一个javascript函数。然后控件将返回到java直到回调被执行。 这实际上提示了另一个问题。 javascript方面的变量的生命周期是什么? 谢谢 – Piero 2013-05-10 01:46:52

+1

如果您询问我提供给脚本(绑定到'cb')的Java变量的生命周期,我相信Object('JsCallback')不会被Java垃圾收集,直到'ScriptEngine'本身('engine')完全解除引用并可用于收集。如果你担心在js开始使用它的时候''cb' var不在js中,我认为你不需要。这里有一个很好的链接,可以更多地了解一些内部工作: http://stackoverflow.com/questions/6936223/what-is-the-lifecycle-and-concurrency-semantics-of-rhino-script-engine – cmbaxter 2013-05-10 10:25:01

1

在Java中使用8 Function

JS:

run = function(callback) { 
    callback("foo"); 
} 

的Java:

Function<String,String> fn = (arg) -> { 
    return arg.toUpperCase(); 
}; 

// call run(fn) 
invokeFunction("run", fn) 

您还可以使用Runnable接口(没有参数和返回值),并可能很多其他单方法接口的回调接口。从我所做的事情来看,它会试图找到一个动态匹配参数列表的方法。

想必您也可以使用它将函数绑定到范围。

相关问题