3

考虑我们有以下 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 返回的承诺?

4

2 回答 2

2

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

医生说:

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

可能对您的情况有用。

于 2020-10-01T10:24:33.863 回答
1

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

于 2020-10-01T17:22:55.937 回答