Apollo 客户端:@defer 可以与客户端解析器一起使用吗?

Apollo client: Can @defer be used with client side resolvers?

出于某种原因,我不得不构建一个仅客户端的 GraphQL 服务器,我的架构构建如下:

    private buildSchema(): GraphQLSchema {
        const allTypes: string = ...// my types
        const allResolvers: IResolvers[] = ...// my resolvers

        return makeExecutableSchema({
            typeDefs: allTypes,
            resolvers: allResolvers
        });
    }

客户端如下:

        this.client = new ApolloClient({
            link: new SchemaLink({schema: this.buildSchema()}),
            cache: new InMemoryCache({
                addTypename: false
            })
        });

一切正常,除了我的查询不是 defered。例如,如果我 运行:

const gqlQuery: string = `
{
user {
   name
   slowResolver @defer {
      text
      }
   }
}
`

const $result = this.apollo.getClient().watchQuery({
query: gql(gqlQuery)
});

$result 只会在整个查询被解析时发出(而不是像预期的那样 user 然后 slowResolver)。

知道我在工作流程中遗漏了什么吗?

@defer 指令实际上已从 Apollo 中删除,尽管有 some work done to reimplement it。不过,即使实现了,延迟查询也必须在执行上下文之外处理。换句话说,执行模式可以 return 延迟执行结果,但其他东西(如 Apollo 服务器本身)必须处理该响应(包括初始负载和后续补丁)如何实际发送到服务器通过任何交通工具。

不幸的是,如果您要在客户端定义模式,则无法使用 @defer 指令。