【问题标题】: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 要求在子字段之前解析父字段:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 2021-10-12
      • 2021-02-26
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多