在 GraphQL 中,我们通过 Subscription 实现了实时数据交互的能力。而为了更方便地使用和管理 Subscription,我们可以使用 npm 包 graphql-subscriptions。
安装和使用
要安装 graphql-subscriptions,我们只需要在终端中运行以下命令即可:
npm install graphql-subscriptions
graphql-subscriptions 的核心是 PubSub 类,它允许我们创建一个发布-订阅系统,用于处理 Subscription 请求和响应。下面是一个简单的使用示例:
-- -------------------- ---- ------- ----- - ------ - - --------------------------------- ----- ------ - --- --------- -- -- ----- ------------ - --------------------------- --------- -- - --------------------- --- -- -- ------------------------- - -------- ------ ------- --- -- ---- ---------------------------
在上面的示例中,我们创建了一个 PubSub 对象,并使用 subscribe
方法订阅了一个名为 'myTopic'
的主题。当我们使用 publish
方法发布了一个带有 { message: 'Hello world!' }
数据的消息时,订阅函数会被触发并打印出该消息的内容。
高级用法
除了基本的订阅和发布之外,graphql-subscriptions 还提供了一些高级的用法,例如:
使用 AsyncIterator
除了使用普通函数作为订阅回调函数之外,我们还可以使用 AsyncIterator,这样就可以更方便地处理异步操作。下面是一个使用 AsyncIterator 的示例:
-- -------------------- ---- ------- ----- - ------------ - - ---------------- ----- - ------------------ - - -------------------------------------- ----- - -------------------- - - --------------------------------- ----- - -------- --------- - - ------------------- ----- - ------ - - --------------------------------- ----- -------- - - ---- ----- - ------ ------ - ---- ------------ - --------- ------ - -- ----- --------- - - ------ - ------ -- -- ------ -------- -- ------------- - --------- - ---------- ----- ------------ --- - ------ -- - ----- ------- - --------------------------------------- ---- ----- -------- - ----- ------------------------------ --- ----- ------ ------- -- --------- - ----- -------- - -- -- -- -- ----- ------ - ---------------------- --------- --------- --- ----- ------ - --- --------- ----- ------------------ - -------------------------- - ------- -------- ---------- ---------- -- -- -- ------ --- -- - ------- --------------- ----- ----------- -- -- ---------------------------------------------------------------
在上面的示例中,我们使用 async function*
定义了一个 Subscription 的订阅函数,并在其中使用 asyncIterator
方法创建了一个 AsyncIterator 对象,然后通过 yield
关键字不断地将订阅到的消息返回给客户端。
使用 withFilter 过滤消息
有时候,我们需要根据一些条件来过滤订阅到的消息。graphql-subscriptions 提供了 withFilter
方法来方便地实现这个功能。下面是一个使用 withFilter 的示例:
-- -------------------- ---- ------- ----- - ------- ---------- - - --------------------------------- ----- ------ - --- --------- ----- ------------ - ----------------- ---------- ----------- --------- ---------- -- - ------ -------------- --- ----------------- -- --------- -- - ------ ---------------- -- -- -- -- ---- ------------------------- - ------- ------ -------- ------ -------- --- -- ---- ------------------------ ---------- - ------- ------ -- ----- ------- -- - ------------------- -- ---
在上面的示例中,我们创建了一个带有 userId 和 message 字段的消息,并且在订阅时通过 withFilter
方法过滤出了符合条件
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/42578