【问题标题】:GraalVM JavaScript in Java - How to identify an async methodJava 中的 GraalVM JavaScript - 如何识别异步方法
【发布时间】:2021-01-16 09:27:00
【问题描述】:

假设我们有以下 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 返回的 promise?

【问题讨论】:

    标签: javascript java promise graalvm polyglot


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你能尝试通过thisvalue.getMetaObject()检查内容吗?

      医生说:

      返回与此值关联的元对象,如果是 没有可用的元对象。元对象表示对 物体,揭示了它的善良和特征。一些信息表明 元对象可能定义包括基础对象的类型、接口、 类、方法、属性等

      可能对您的情况有用。

      【讨论】:

      • 这听起来确实是一个更好的主意。比如检查value.getMetaObject().getMetaSimpleName().equals("Promise")。如果我找不到更好的解决方案,我会将其标记为答案。谢谢!
      猜你喜欢
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多