【问题标题】:Not wait for the parent @GraphQLContext resolver to resolve不等待父 @GraphQLContext 解析器解析
【发布时间】:2020-03-17 11:05:55
【问题描述】:
在执行子解析器之前是否可以不必等待父 @GraphQLContext 解析器完全解析?
通过查看源代码,我认为可以通过利用期货来实现这一点,如下所示:
@GraphQLQuery
public Future<User> user() {
return CompletableFuture.supplyAsync(...);
}
@GraphQLQuery
public TwitterProfile twitterProfile(@GraphQLContext Future<User> user) {
...
}
有什么想法吗?
【问题讨论】:
标签:
java
graphql
graphql-java
graphql-spqr
【解决方案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 要求在子字段之前解析父字段:
正在评估的对象值和对象类型需要知道
(强调我的)。这主要是因为子查询需要父查询的结果来解决,而不是一些特殊的约束。
如果您有一个真正独立于其父级的字段,我什至会争辩说它首先不应该有父级。