Java中的GraalVM JavaScript-如何识别异步方法
假设我们有以下JS代码:Java中的GraalVM JavaScript-如何识别异步方法,javascript,java,promise,graalvm,polyglot,Javascript,Java,Promise,Graalvm,Polyglot,假设我们有以下JS代码: async function helloAsync(){ return "Hello"; } function hello(){ return "Hello"; } 在Java中,可以使用以下方法将此代码加载到GraalVM上下文对象中: context.eval("js", mappingTemplate); 给我们两个成员,我们可
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()
是一种方法:它返回与value
实例相关联的JS构造函数,在您的案例中应该是Promise
。这听起来确实是一个更好的主意。比如检查value.getMetaObject().getMetaSimpleName()是否等于(“承诺”)
。如果我找不到更好的解决方案,我会把这个标记为答案。谢谢