我遇到了一个问题。
在我的主程序中,我有多个函数在运行。
在某一点上,我只是调用一个随机脚本(file_XXX. js),它可以改变(几个不同的文件)。这个文件被执行,从那里我的主程序调用从file_XXX导出的函数,file_XXX调用从主程序导出的函数。
因此,两者之间存在数据交换。
然后在某个时刻,当一切都完成时,我必须完全删除file_XXX的导入,就好像它从来没有被调用过一样(有三个原因,当我再次调用它时,我必须从0开始,以避免在调用其他文件时程序过载,最后,我在file_XXX中有setInterval和promise,所以我想清除所有这些)。
谢谢你的帮忙!
目前我正在执行以下操作:
- 第一个月
- 执行函数文件_XXX. wakeUp()
- 主程序和此文件之间通过exports. function()进行数据交换...
delete require.cache[require.resolve("file_XXX.js")];
但是间隔和承诺继续运行...
1条答案
按热度按时间hgncfbus1#
解决这类问题的最简单方法是在模块初始化时不运行任何代码,而是导出函数,以便在启动或停止模块的操作时可以调用这些函数,然后,只需调用
stop()
即可停止先前正在运行的任何操作(如计时器或其他模块状态或其他需要清理的东西),然后当您再次调用start()
时,它将再次从头开始。因此,与其卸载模块以便再次加载,不如使用导出的函数来启动和停止操作。注意,nodejs从不卸载实际的代码,所以你真的不想该高速缓存中删除,然后一次又一次地加载同一个模块。只需加载模块一次,然后使用模块中的导出函数来完成你想做的事情。
请注意,ESM模块(您最终会希望切换到它)永远不会让您卸载它们或该高速缓存中删除它们以重新运行模块初始化。因此,最好只进行设计而不进行这些操作。只需将模块初始化时正在运行的代码重构到导出的函数中。
告诉你,承诺不会“跑”(它们只是用于监视异步操作何时完成的通知机制)。但是,一个连接到约定的异步操作可能正在运行,你不能通过从模块缓存中删除一些东西来停止它。这是一个完全独立的事情。停止正在进行的异步操作的唯一方法是查找或编写一个特定于异步操作正在执行的操作的取消操作。nodej中的许多异步操作都没有取消功能,其他的,比如定时器,则有取消操作。