tl;博士:
我如何/如何在 Java 中存储多个 js 函数的函数句柄以供以后使用?目前我有两个想法:
-
创建多个 ScriptEngine 实例,每个实例包含一个加载的函数。将它们按列存储在地图中,列表中每列有多个条目。看起来像是一个很大的开销,这取决于 ScriptEngine 实例的“重”......
-
一些将相同目标字段的方法附加到数组的 Javascript 解决方案。还不知道如何从 java 端访问它,但也不喜欢它。想让脚本文件尽可能愚蠢。
var test1 = test1 || []; test1.push(function(input) { return ""; });
-
???
想法或建议?
告诉我更多:
我有一个项目,其中有一个包含脚本文件的目录(javascript,预计会有一百多个文件,将来会增长)。这些脚本文件的名称如下:test1;toupper.js
、test1;trim.js
和 test2;capitalize.js
。分号之前的名称是脚本将要处理的列/字段,分号之后的部分是人类可读的文件功能描述(简化示例)。所以在这个例子中,有两个脚本将分配给“test1”列,一个脚本分配给“test2”列。 js-function 模板基本上是这样的:
function process(input) { return ""; };
我的想法是,在服务器启动时加载(并评估/编译)所有脚本文件,然后在需要时按列使用加载的函数。到目前为止,一切都很好。
我可以使用以下代码加载/评估单个函数。示例使用 GraalVM,但也应该可以用其他语言重现。
final ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js");
final Invocable invocable = (Invocable) engine;
engine.eval("function process(arg) { return arg.toUpperCase(); };");
var rr0 = invocable.invokeFunction("process","abc123xyz"); // rr0 = ABC123XYZ
但是当我加载/评估下一个具有相同名称的函数时,前一个函数将被覆盖 - 逻辑上,因为它的函数名称相同。
engine.eval("function process(arg) { return arg + 'test'; };");
var rr1 = invocable.invokeFunction("process","abc123xyz"); // rr1 = abc123xyztest