2013-05-10 51 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接口(沒有參數和返回值),並可能很多其他單方法接口的回調接口。從我所做的事情來看,它會試圖找到一個動態匹配參數列表的方法。

想必您也可以使用它將函數綁定到範圍。

相關問題