GraphQL 订阅:如何根据订阅中的事件更新对象

Posted

技术标签:

【中文标题】GraphQL 订阅:如何根据订阅中的事件更新对象【英文标题】:GraphQL subscription: How to update object based on the event in subscription 【发布时间】:2017-08-09 17:48:48 【问题描述】:

当事件发布到PasswordUpdated 频道时,我正在尝试更新我之前检索到的用户密码。这是我迄今为止尝试过的,

this.apollo.subscribe(
  query: this.passwordUpdatedSubscription
).subscribe((passwordUpdated:any) => 
  this.userDataQuery.updateQuery((previousResult) => 
    previousResult.getUsers.filter(user => user.name === passwordUpdated.name).forEach(user => user.password = passwordUpdated.password);
  );

);

但是,我刚刚从控制台中的错误中发现previousResult 是不可变的。当我尝试更新previousResult 中的密码时,该属性有writable: false。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您必须返回更改后的先前结果。查看 subscription docu 获取 apollo 客户端。下面是更新查询的重点。

您可能想查看reacts immutability helper,它稍微解释了问题所在。

【讨论】:

SubscribeToMore 函数仅适用于 apollo-react 客户端。不幸的是,它不适用于 Angular 客户端。我从该页面检查了 updateQuery,看起来他们正在重新创建 newComments 数组并将新的 cmets 推送到它,这是我试图避免的。我正在寻找一种方法来改变以前的结果,而不是从以前的结果中重新创建一个新的结果。 你是对的。我没有找到SubscribeToMore。您可以检查的一件事是否有可能是 angular 的 apollo 客户端在后台使用 dataIdFromObject docu 为您执行此操作。当您的响应包含用户的 id 时,它应该更新 apollo 存储。

以上是关于GraphQL 订阅:如何根据订阅中的事件更新对象的主要内容,如果未能解决你的问题,请参考以下文章

Amplify GraphQL 订阅不响应事件

如何订阅relay/graphql突变的进度事件

如何立即触发 apollo graphql 订阅?

收到新订阅时如何更新导航标题中的计数?

我如何在 react-native 聊天应用程序中使用 GraphQl 订阅从 GraphQl 查询中获取实时更新

EventBus事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )