当前位置: 首页 > 知识库问答 >
问题:

如何存储ScriptManager中的函数句柄供以后使用?

万乐逸
2023-03-14

tl; dr:
如何/可以将多个js-函数的函数句柄存储在java中以供以后使用?目前我有两个想法:

>

  • 创建多个脚本引擎实例,每个实例包含一个加载的函数。将它们按列存储在地图中,列表中每列有多个条目。看起来开销很大,这取决于ScriptEngine实例的“重量”。。。

    一些Javascript解决方案将相同目标字段的方法附加到数组。还不知道如何从java端访问它,但也不喜欢它。希望尽可能保持脚本文件愚蠢。

     var test1 = test1 || [];
     test1.push(function(input) { return ""; });
    

    ???

    想法还是建议?

    告诉我更多信息:
    我有一个项目,其中有一个包含脚本文件的目录(javascript预计会有100多个文件,将来还会增长)。这些脚本文件的名称如下:test1;图珀。jstest1;修剪jstest2;资本化js。分号前的名称是脚本将要处理的列/字段,分号后的部分是文件功能的可读描述(简化示例)。因此,在本例中,有两个脚本将分配给“test1”列,一个脚本分配给“test2”列。js函数模板基本上如下所示:

        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
    
  • 共有1个答案

    暨弘毅
    2023-03-14

    我会这样做。

    推荐使用Graal的方法。js是通过polyglot API实现的:https://www.graalvm.org/reference-manual/embed-languages/

    与ScriptEngine API可能不一样,但这是使用多语言API的示例。

    1. 将函数定义包装在()
    2. 将函数返回Java
    3. 未图示,但您可能会构建一个从列名到要在其上调用的函数列表的映射。
    4. 调用数据上的函数。
    import org.graalvm.polyglot.*;
    import org.graalvm.polyglot.proxy.*;
    
    public class HelloPolyglot {
        public static void main(String[] args) {
            System.out.println("Hello Java!");
            try (Context context = Context.create()) {
                Value toUpperCase = context.eval("js", "(function process(arg) { return arg.toUpperCase(); })");
                Value concatTest = context.eval("js", "(function process(arg) { return arg + 'test'; })");
    
                String text = "HelloWorld";
                text = toUpperCase.execute(text).asString();
                text = concatTest.execute(text).asString();
    
                System.out.println(text);
            }
        }
    }
    

    现在,Value。execute()返回一个,为了简单起见,我用asString()将其强制为一个Java字符串,但您不必这样做,您可以对进行操作(下面是值的API:https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/Value.html).

     类似资料:
    • 你可以创建任何MATLAB函数的句柄,然后用这些句柄作为函数链接的途径。函数句柄主要用来传递自变量列表给其他函数,用句柄执行函数或求值。 在MATLAB中,通过在函数名前加上符号@构造函数句柄。下面例子为SIN函数创建一个函数句柄,然后赋值给变量fhandle: fhandle = @sin; 用MATLAB的fevel函数对函数句柄求值。下面的plot_fhandle函数接收一个函数句柄和数据

    • 我正在使用放心进行API测试自动化。我想在调用API后将响应存储为对象,这样我就可以使用该对象验证一些数据,如状态代码、正文、标题等。 我试着使用但它只允许存储字符串,如果将响应存储为类似字符串的并尝试检索

    • 本文向大家介绍如何临时存储数据以便以后在Oracle中使用?,包括了如何临时存储数据以便以后在Oracle中使用?的使用技巧和注意事项,需要的朋友参考一下 问题: 您要临时存储SQL的结果。 解 我们可以使用CREATE GLOBAL TEMPORARY TABLE语句创建一个表,该表临时存储会话的数据。此外,您可以指定是保留会话的临时表数据还是事务提交之前。我们可以进一步使用ON COMMIT

    • 函数名称:判断句柄 函数功能:判断是否为有效句柄 函数方法 bool = io.type(file) 参数 类型 必填 说明 file userdata 是 需要判断的文件句柄 返回值 类型 说明 bool string “file“ - 一个打开的文件句柄,"closed file“ - 为一个已关闭的文件句柄,nil - 不是文件句柄 函数用例 file,msg = io.open("/mnt

    • 问题内容: 假设我正在Jupyter / Ipython笔记本中进行较大的数据分析,并且完成了大量耗时的计算。然后,由于某种原因,我必须关闭jupyter本地服务器I,但是我想稍后再进行分析,而不必再次进行所有耗时的计算。 我想什么 想 爱做的是或存储整个Jupyter会话(所有大熊猫dataframes,np.arrays,变量,…),所以我可以放心地关闭服务器知道我可以在完全相同的状态返回到我