[英]How to access Java exception that causes ScriptException using JSR-223
[英]JSR-223: How to bind a variadic host function to ScriptEngine
我正在尝试通过Java VM下的JSR-223 ScriptEngine
运行Javascript来调用用户提供的代码,并将其传递给“承诺样式”回调:即,一个不接受任何参数(成功完成且没有值)的函数; 单个参数(对于没有值或错误对象的成功完成,为null
); 或两个参数(成功完成时为null
,一个值)。
我为此使用GaalVM,并将回调函数放入Javascript绑定对象中。 像这样:
var engine = new ScriptEngineManager().getEngineByName("graal.js");
var binding = engine.getBindings(ScriptContext.ENGINE_SCOPE);
binding.put("exports", engine.eval("new Object()"));
engine.eval(userCode, binding);
binding.put("data", data);
binding.put("callback", callback);
engine.eval("exports.handler(data, callback)", binding);
问题是我无法弄清楚应将什么作为"callback"
绑定:
我尝试了简单的方法:
BiFunction<Object, Object, Object> callback = (err, value) -> { /* ... */ };
在这种情况下,使用两个参数调用回调可以很好地工作,但是使用一个参数(或不使用参数)时,我会收到错误消息:
org.graalvm.polyglot.PolyglotException: TypeError: EXECUTE on
JavaObject[my.package.JavascriptRun$$Lambda$771/0x0000000840844040@4cf04c6a
(my.package.JavascriptRun$$Lambda$771/0x0000000840844040)] failed due to:
Arity error - expected: 2 actual: 1
我试着像这样获取一个Object
数组:
Function<Object[], Object> callback = (args) -> { /* ... */ };
这导致GraalVM向我扔了这个:
org.graalvm.polyglot.PolyglotException: TypeError: EXECUTE on
JavaObject[my.package.JavascriptRun$$Lambda$771/0x0000000840844040@855ef90
(my.package.JavascriptRun$$Lambda$771/0x0000000840844040)] failed due to:
java.lang.ClassCastException: class com.oracle.truffle.polyglot.PolyglotMap
cannot be cast to class [Ljava.lang.Object;
(com.oracle.truffle.polyglot.PolyglotMap is in unnamed module of loader 'app';
[Ljava.lang.Object; is in module java.base of loader 'bootstrap')
我目前正在使用Javascript进行手动多次调度-基本上定义了多个回调宿主函数,然后在Javascript中检查参数数量并相应地进行调度:
engine.eval("exports.handler(data, function() { "+
"switch(arguments.length) { "+
"case 0: return callback0(); "+
"case 1: return callback1(arguments[0]); "+
"default: return callback2(arguments[0],arguments[1]); "+
"} })");
但这对我来说似乎是个坏主意。
MyCallback callback = (arguments) -> { /*...*/ };
哪里
@FunctionalInterface
public static interface MyCallback {
Object call(Object... arguments);
}
我想它将为您服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.