gpt4 book ai didi

javascript - JSR-223 : How to bind a variadic host function to ScriptEngine

转载 作者:行者123 更新时间:2023-12-02 10:05:35 25 4
gpt4 key购买 nike

我正在尝试通过 Java VM 下的 JSR-223 ScriptEngine 运行 Javascript,以调用用户提供的代码并向其传递“promise-style”回调:即接受以下任一函数的函数无参数(成功完成但没有值);单个参数(null 表示成功完成,没有值或错误对象);或两个参数(null 表示成功完成,一个值)。

我为此使用 GaalVM,并将回调放入 Javascript 绑定(bind)对象中。像这样的事情:

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" 绑定(bind):

我尝试过简单的:

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

我猜对你有用。

关于javascript - JSR-223 : How to bind a variadic host function to ScriptEngine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55360807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com