首页 > 解决方案 > 在查询列表时订阅列表以捕获所有项目?

问题描述

这是一个概念性的 GraphQL 问题,与特定的客户端或服务器无关。如果我有一些项目的列表并且我想查询然后订阅更新,我应该怎么做?先订阅,再查询还是反过来?

想象一下以下示例模式:

type Query {
    commentsByPostId(postId: ID!): String
}

type Mutation {
    addCommentToPost(postId: ID!, comment: String): String
}

type Subscription {
    commentAdded(postId: ID!): String
}

schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}

用户点击帖子。我想获取现有评论的列表并订阅未来的更新。我真的不想做手动重复数据删除,但不丢失更新更重要。所以到目前为止我想出的最好的处理方法是首先订阅更新,然后进行查询,一旦查询结果到达,将它们与迄今为止收到的更新列表合并。有更好的方法吗?

标签: graphql

解决方案


方法 A

根本不要使用查询。只需让您的订阅返回曾经添加到帖子中的所有评论。您将它们收集到客户端的列表中(无论如何您都这样做)。

单独传输它们可能会有一些开销,但它工作得很好,客户端上的代码更少。另一方面,客户端很难知道何时收到“初始”评论,并且应该第一次呈现。

方法 B

发送带有查询结果的令牌(例如时间戳),并让您的订阅接受与参数相同的参数以接收此后的所有事件。

scalar Cursor;

type Comments {
    continue: Cursor
    values: [String!]
}

type Query {
    commentsByPostId(postId: ID!): Comments
}

type Subscription {
    commentsAdded(postId: ID!, since: Cursor): String
}

推荐阅读