我一直遇到同样的问题,无法相信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客户端并清理活动订阅者列表等。