- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 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/
我使用 java 脚本引擎来评估我拥有的字符串的数学。 import javax.script.ScriptEngineManager; import javax.script.ScriptEngin
我使用的是 JSR223 ScriptEngine ( JAV8 ),它本身不是线程安全的。由于我需要多个线程才能访问 ScriptEngine,因此每个 ScriptEngine 都属于一个 Eng
我到处搜索但一无所获,所以我想使用Java内置的JavaScript引擎,但是用户无法导入java类,例如以下任何一个: importPackage(package.example); 或 impor
我的应用程序使用 ScriptEngine 为我的最终用户提供插件功能。 ScriptEngineManager engineManager = new ScriptEngineManager();
Java 有一个 ScriptEngine允许您以不同语言运行/评估语句的系统。 我知道支持 JavaScript,但我找不到任何其他语言可以使用它。 例如,是否实现了 Ruby? 最佳答案 这是一个
这是我为冒险岛服务器运行的一些代码。每当与 NPC 交谈等事件的脚本应该发生时,该脚本将运行以为任何正在调用的脚本(NPC、门户、事件等)创建脚本路径。 我也在用jdk1.7.0_80 lang-ja
我在 Java ScriptEngine 中执行 JavaScript 方法数组时遇到问题。 我使用 JDK 8。 示例 @Test public void arrayMethod() throws
这样我就将 console.log 功能添加到了 javax.script.ScriptEngine 中。 public class Console { public void
我有一个为每个线程创建的脚本引擎。问题是每个线程都在等待其他线程完成。线程应该异步运行。当我注释掉 ScriptEngine.eval() 行的位置时,代码的运行方式应该是这样 启动线程 每次大约创建
我有课Foo只有一个静态方法(值得注意),称为 bar() 。我需要访问bar()通过运行时脚本(在本例中为 Javascript)。 final ScriptEngineManager factor
有什么想法吗?公开课主要{ public static void main(String[] args) throws ScriptException { ScriptEngine engin
我有一些代码如下。 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.get
我需要以某种方式深度克隆我的 ScriptEngine 的整个绑定(bind)集对象。 我尝试过的 到目前为止,我已经尝试了 Cloner library克隆整个绑定(bind)结构。如果它有效,那就
我们目前正在为我们的产品之一添加服务器端脚本功能。作为其中的一部分,我正在评估 JSR 223 脚本引擎。由于我们可能会在服务器上运行大量脚本,因此我特别关注这些脚本引擎的内存使用情况。将 Rhino
我刚开始使用 Java ScriptEngine 对我的应用程序做一些扩展,然后我注意到我可以在脚本中导入所有 java 类并不受限制地使用它们。有没有办法指定脚本可以使用哪些类?我不希望他们做 ja
我需要在不同的类加载器“内部”执行一些 javascript 代码。如果是 java,每个任务将在单独的类加载器中运行。现在我需要它是 javascript。 我是否需要在每个类加载器中创建新的 Sc
我正在寻找一个 C# 脚本引擎,它可以解释 C# 代码块,同时维护上下文。例如,如果输入:var a = 1;,然后输入 a + 3,它将输出 4。我知道 MS Roslyn ,它确实这样做了,但它是
如何使用 ScriptEngine 调用函数或模块。 这是我的示例代码,编译良好,但在运行时抛出异常 scalaVersion := "2.12.4"and sbt.version = 0.13.16
我正在使用 Java 7,并且我有以下使用 jsondiffpatch 的代码JavaScript 库: logger.debug("CURRENT PATH=" + Paths.get("").to
我正在使用 ScriptEngine 来执行字符串中指定的计算。我尝试了一个简单的程序,如下所示: public static void main(String[] args){ Scrip
我是一名优秀的程序员,十分优秀!