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