是否有可能不必等待父@GraphQLContext
解析器完全解析之后再执行子解析器?
通过查看源代码,我认为这可以通过利用期货来实现,例如:
@GraphQLQuery
public Future<User> user() {
return CompletableFuture.supplyAsync(...);
}
@GraphQLQuery
public TwitterProfile twitterProfile(@GraphQLContext Future<User> user) {
...
}
有什么想法吗?
答案 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强制要求在子项之前解决父字段:
正在评估的对象值和对象类型需要已知
(重点是我的)。这主要是因为子查询需要父查询的结果,而不是一些特殊的约束。 如果您有一个真正独立于其父级的字段,那么我会争辩说它不应该首先拥有父级。