0

@GraphQLContext在执行子解析器之前是否可以不必等待父解析器完全解析?

通过查看源代码,我认为这可能通过利用期货来实现,如下所示:

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

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

有任何想法吗?

4

1 回答 1

2

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

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

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

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

也就是说,GraphQL 规范要求在子字段之前解析父字段:

被评估的对象值和对象类型需要知道

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

于 2019-11-29T15:56:21.643 回答