不等待父@Gr​​aphQLContext解析器解析

时间:2019-11-21 13:30:15

标签: java graphql graphql-java graphql-spqr

是否有可能不必等待父@GraphQLContext解析器完全解析之后再执行子解析器?

通过查看源代码,我认为这可以通过利用期货来实现,例如:

@GraphQLQuery
public Future<User> user() {
    return CompletableFuture.supplyAsync(...);
}

@GraphQLQuery
public TwitterProfile twitterProfile(@GraphQLContext Future<User> user) {
    ...
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用CompletionStage(其中CompletableFuture是其子类型)组成一个异步链。简单的Future是不够的,因为它不允许合成。这是graphql-java本身的功能,而不是SPQR特有的功能。

@GraphQLQuery
public CompletableFuture<User> user() {
    return CompletableFuture.supplyAsync(...);
}

@GraphQLQuery
public TwitterProfile twitterProfile(@GraphQLContext User user) {
    ...
}

请注意,线程和并发仍然完全在您的控制之下。这只是让您适当地编写异步解析器,但是您实际上需要启动一个线程来自己完成承诺(例如,通过supplyAsync)。这也意味着相同级别的字段可以同时解析。

也就是说,GraphQL spec强制要求在子项之前解决父字段:

  

正在评估的对象值和对象类型需要已知

(重点是我的)。这主要是因为子查询需要父查询的结果,而不是一些特殊的约束。 如果您有一个真正独立于其父级的字段,那么我会争辩说它不应该首先拥有父级。