Отказаться от подписки в Apollo Client

В моем компоненте у меня есть этот код:

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,
              ],
            },
          },
        })
      }
    },
  })
}

Проблема в том, что этот компонент будет повторно подписываться при подключении и будет поддерживать подписку, даже если он отключен.

Как я могу отказаться от подписки на свой компонент?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
0
13 691
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

client.subscribe({ ... }).subscribe({ ... }) вернет экземпляр для вашей подписки, который вы можете использовать для отказа от подписки.

Так что-то вроде:

componentDidMount () {
  // Setup subscription listener
  // (...)
  this.querySubscription = client.subscribe({
    // (...)
  }).subscribe({
    // (...)
  })
}

componentWillUnmount () {
  // Unsibscribe subscription
  this.querySubscription.unsubscribe();
}

Вы можете получить некоторое вдохновение, посмотрев, как react-apollo управляет этой ситуацией смотрит на их кодовую базу.

ПРИМЕЧАНИЕ: Мой лучший совет - использовать компонент Подписка, который будет управлять всем за вас.

Я уже пробовал это, но это не сработало. В итоге я использовал subscribeToMore, который делает именно то, что я хочу, и отлично работает. Спасибо

V0iDiFiER 25.07.2018 15:43

К сожалению, компонент подписки также требует некоторых действий по отмене подписки при использовании обратного вызова onSubscriptionData.

Vladislav Sorokin 13.06.2019 20:25

@VladislavSorokin Подскажите, как вы отписались от subscribeToMore?

TheoG 27.07.2019 21:24

@TheoG На самом деле я этого не делал, во-первых, subscribeToMore в моем случае вообще не обновлял кеш, поэтому сейчас я как бы борюсь с этим. Отвечая на ваш вопрос, они говорят: «Эта функция возвращает обработчик функции отписки, который можно использовать для отказа от подписки позже». хотя я не знаю, как это реализовать, извините apollographql.com/docs/react/api/react-apollo/…

Vladislav Sorokin 28.07.2019 16:40

@TheoG вот другие ребята сказали, что subscribeToMore каким-то образом автоматически отписывается, надеюсь, это поможет github.com/bmsantos/apollo-graphql-subscriptions-example/iss‌ ues /…

Vladislav Sorokin 28.07.2019 18:44

btw subscribeToMore действительно обновил кеш в моем случае, но это был компонент Query, который не выполнял повторную визуализацию после обновления, поэтому мне удалось исправить это с помощью refetch. Довольно хакерский, но работает! @TheoG

Vladislav Sorokin 30.07.2019 17:31

@VladislavSorokin Как вы заставляете работать refetch, ведь размещение его после объекта return в subscribetoMore никогда не будет достигнуто?

TheoG 30.07.2019 22:23

@VladislavSorokin Я фактически решил проблему повторного рендеринга, изменив запросы fetchPolicy на "cache-and-network".

TheoG 31.07.2019 11:01

Другие вопросы по теме