繁体   English   中英

Java 中的 GraalVM JavaScript - 如何识别异步方法

[英]GraalVM JavaScript in Java - How to identify an async method

考虑我们有以下 JS 代码:

    async function helloAsync(){
        return "Hello";
    }

    function hello(){
        return "Hello";
    }

在 Java 中,您可以使用以下方法将此代码加载到 GraalVM 上下文对象中:

    context.eval("js", mappingTemplate);

给我们两个成员,我们可以使用以下方法进行评估:

    Value bindings = context.getBindings("js");
    final Value executionResult1 = bindings.getMember("hello")
                        .execute();
    final Value executionResult2 = bindings.getMember("helloAsync")
                        .execute();

因此, executionResult2将是一个可以在 Java 中完成的承诺。 我的问题是如何可靠地判断executionResult2实际上是一个承诺,而不仅仅是像executionResult1这样的字符串。 目前,一种幼稚且不可靠的方法可能是:

if (executionResult.toString().startsWith("Promise") &&
                    executionResult.hasMember("then") && executionResult.hasMember("catch"))

有哪些更可靠/优雅的方式来识别从 JS 返回的承诺?

您可以尝试通过value.getMetaObject()检查内容value.getMetaObject()

医生说:

返回与此值关联的元对象,如果没有可用的元对象,则返回 null。 元对象表示对象的描述,揭示它的种类和特征。 元对象可能定义的一些信息包括基对象的类型、接口、类、方法、属性等。

可能对您的情况有用。

是的, value.getMetaObject()是要走的路:它返回与value实例关联的 JS 构造函数,在您的情况下应该是Promise

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM