我正在使用 AsyncLocalStorage 来跟踪在我的后端运行的事件(userId、url 等)。使用相同的 AsyncLocalStorage 为运行的每个单独事件创建一个存储:
//At startup one AsyncLocalStorage context is made
const context = new AsyncLocalStorage()
然后当事件开始时(例如 API 调用)我使用 context.run
const runWithStore = (data: any, callBack: () => any) => {
return context.run(data, () => {
callBack();
});
};
现在我想知道这家商店是如何收集垃圾的?是
callBack
结束之后吗?
询问原因: 我遇到了一个非常奇怪的问题,其中“保存后”挂钩(猫鼬)正在使用与该挂钩无关的商店(挂钩由于内部事件而正在运行)。
从逻辑上讲,商店应该不可用,因为“保存后”挂钩位于主流程之外。但这种行为似乎很随机。有时该存储不可用(应该如此),但有时它正在使用为 WS 事件创建的存储,该事件已长期处理(并且与此“保存后”挂钩无关)
所以我想知道下面发生了什么,因为这些商店绝对不应该在不同的活动之间共享。
您在上下文 (asyncLocalStorage.getStore()) 中存储的数据独立于 AsyncLocalStorage 实例本身。当该数据完成时,它会与相应的异步操作一起被垃圾收集。无需单独调用来管理存储数据的垃圾收集。