Недавно Apollo Client выпустил функцию подписки на веб-сокеты, но до сих пор я видел ее использование только при запуске запроса с помощью subscribeToMore внутри ловушки жизненного цикла componentWillMount.
Вот пример из https://dev-blog.apollodata.com/tutorial-graphql-subscriptions-client-side-40e185e4be76#0a8f.
const messagesSubscription = gql`
subscription messageAdded($channelId: ID!) {
messageAdded(channelId: $channelId) {
id
text
}
}
`
componentWillMount() {
this.props.data.subscribeToMore({
document: messagesSubscription,
variables: {
channelId: this.props.match.params.channelId,
},
updateQuery: (prev, {subscriptionData}) => {
if (!subscriptionData.data) {
return prev;
}
const newMessage = subscriptionData.data.messageAdded;
// don't double add the message
if (!prev.channel.messages.find((msg) => msg.id === newMessage.id)) {
return Object.assign({}, prev, {
channel: Object.assign({}, prev.channel, {
messages: [...prev.channel.messages, newMessage],
})
});
} else {
return prev;
}
}
});
}
Но subscribeToMore специфичен. для интеграции Apollo Client React. В VanillaJS есть watchQuery, но это заявил, что он не должен использоваться для подписок. Также существует подписка Это может быть то, что я ищу, но это не задокументировано.
Есть ли способ использовать клиент Apollo GraphQL для обработки подписок, не находясь внутри компонента React?