Я искал способ обработки отключений веб-сокетов в моем приложении React с подписками Apollo и не нашел способа сделать это. В других примерах, которые я вижу в документации по аполлону, показан следующий метод перехвата повторного подключения:
const wsClient = process.browser ? new SubscriptionClient(WSendpoint, {
reconnect: true,
}) : null;
const wsLink = process.browser ? new WebSocketLink(wsClient) : null;
if (process.browser) {
wsLink.subscriptionClient.on(
'reconnected',
() => {
console.info('reconnected')
},
)
}
Есть две проблемы с вышеуказанным методом:
То, что я хотел бы сделать, это перезагрузить мой компонент «чат», если пользователь либо отключится от своего Интернета, либо если мой экспресс-сервер выйдет из строя по какой-либо причине. Чтобы это произошло, мне нужно, чтобы мой компонент чата полностью перезагрузился, что, я не уверен, будет возможно из-за пределов моего дерева компонентов.
Есть ли в компонентах Query или Subscription Apollo способ захвата этого события и обработки его соответствующим образом из компонента?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Есть несколько способов, которые я могу придумать для обработки этих случаев, но ни один из них не является одноразовым решением, каждый случай должен обрабатываться независимо.
online/offline (ссылка)Apollo middleware для обработки сетевых ошибок с вашего сервера (ссылка)isOnline, которая может содержать глобальную ссылку на состояние вашего приложения. Всякий раз, когда срабатывают два вышеуказанных метода, вы можете обновить значение isOnlineisOnline для обработки состояния сети для каждого компонента. Это можно использовать для обработки сообщений об ошибках сети, обновления компонентов после восстановления сети.Вы можете использовать обратные вызовы SubscriptionClient из subscriptions-transport-ws, например:
const ws = require("ws");
const { SubscriptionClient } = require("subscriptions-transport-ws");
const { WebSocketLink } = require("apollo-link-ws");
const { ApolloClient } = require("apollo-client");
const { InMemoryCache } = require("apollo-cache-inmemory");
const subClient = new SubscriptionClient(
'ws://localhost:4000/graphql',
{ reconnect: true },
ws
);
subClient.onConnected(() => { console.info("onConnected") });
subClient.onReconnected(() => { console.info("onReconnected") });
subClient.onReconnecting(() => { console.info("onReconnecting") });
subClient.onDisconnected(() => { console.info("onDisconnected") });
subClient.onError(error => { console.info("onError", error.message) });
const wsLink = new WebSocketLink(subClient);
const client = new ApolloClient({
link: wsLink,
cache: new InMemoryCache()
});
Я использую это для Node.js, но, вероятно, это сработает и для React.
Обратите внимание, что событие
subClient.onDisconnectedделает улавливает общие отключения от Интернета (очевидно, в отличие от решения в вопросе OP). Конечно, в этом случае требуется несколько секунд, чтобы обнаружить отключение. (если вы отключите Интернет на своем компьютере, вы увидите задержку перед запуском события onDisconnected)