У меня была та же проблема, не могу поверить, что она не встроена в GraphQL или не описана в документации.
Я нашел решение проблемы с github, которую вы можете прочитать здесь
То, как я это исправил, было:
добавил функцию withCancel
в мой распознаватель:
const withCancel = (asyncIterator, onCancel) => {
const asyncReturn = asyncIterator.return;
asyncIterator.return = () => {
onCancel();
return asyncReturn ? asyncReturn.call(asyncIterator) : Promise.resolve({ value: undefined, done: true });
};
return asyncIterator;
};
затем использовал это в моей подписке:
Subscription: {
update: {
subscribe: (root, { id, topic }, ctx, info) => {
logger.info(`start new subscription for ${id}`);
ActiveMQ(id, topic);
return withCancel(pubsub.asyncIterator(id), () => {
console.log(`Subscription closed, do your cleanup`);
});
},
resolve: payload => {
return payload;
},
},
}
Затем я обработал мою логику в обратном вызове, предоставленном withCancel
, который для меня закрывал клиент stomp и очищал список активных подписчиков и т. Д.