【问题标题】:Unsubscribe subscription in Apollo Client在 Apollo 客户端中取消订阅
【发布时间】:2018-12-30 19:11:58
【问题描述】:

在我的组件中,我有以下代码:

componentDidMount () {
  // Setup subscription listener
  const { client, match: { params: { groupId } } } = this.props
  client.subscribe({
    query: HOMEWORK_IN_GROUP_SUBSCRIPTION,
    variables: { groupId },
  }).subscribe({
    next ({ data }) {
      const cacheData = client.cache.readQuery({
        query: GET_GROUP_QUERY,
        variables: { groupId },
      })

      const homeworkAlreadyExists = cacheData.group.homeworks.find(
        homework => homework._id == data.homeworkInGroup._id
      )
      if (!homeworkAlreadyExists) {
        client.cache.writeQuery({
          query: GET_GROUP_QUERY,
          variables: { groupId },
          data: { ...cacheData,
            group: { ...cacheData.group,
              homeworks: [ ...cacheData.group.homeworks,
                data.homeworkInGroup,
              ],
            },
          },
        })
      }
    },
  })
}

问题是这个组件在挂载时会重新订阅,即使卸载也会保持订阅。

如何取消订阅我的组件?

【问题讨论】:

    标签: javascript reactjs apollo react-apollo apollo-client


    【解决方案1】:

    client.subscribe({ ... }).subscribe({ ... }) 将为您的订阅返回一个实例,您可以使用它来取消订阅。

    比如:

    componentDidMount () {
      // Setup subscription listener
      // (...)
      this.querySubscription = client.subscribe({
        // (...)
      }).subscribe({
        // (...)
      })
    }
    
    componentWillUnmount () {
      // Unsibscribe subscription
      this.querySubscription.unsubscribe();
    }
    

    您可以通过查看 react-apollo manages this situation 如何查看他们的代码库来获得一些灵感。

    注意: 我最好的建议是使用Subscription 组件,它将为您管理一切。

    【讨论】:

    • 我已经尝试过了,但没有成功。我最终使用了subscribeToMore,这正是我想要的,而且效果很好。谢谢
    • 很遗憾,订阅组件在使用 onSubscriptionData 回调时也需要一些取消订阅操作
    • @VladislavSorokin 你能分享一下你是如何取消订阅 subscribeToMore 的吗?
    • @TheoG 我实际上并没有,首先 subscribeToMore 在我的情况下根本没有更新缓存,所以我现在有点挣扎。在回答您的问题时,他们说“此函数返回一个取消订阅函数处理程序,可用于稍后取消订阅。”虽然不知道怎么实现,抱歉apollographql.com/docs/react/api/react-apollo/…
    • @TheoG 这里有其他人说 subscribeToMore 会自动取消订阅,希望对 github.com/bmsantos/apollo-graphql-subscriptions-example/issues/… 有所帮助
    猜你喜欢
    • 2017-12-25
    • 2017-12-01
    • 2022-12-12
    • 2018-07-08
    • 2016-08-13
    • 2020-11-20
    • 2019-02-02
    • 2020-08-27
    • 2019-05-03
    相关资源
    最近更新 更多