如何在JavaScript中停止来自外部的递归循环函数?

如何在JavaScript中停止来自外部的递归循环函数?,javascript,node.js,recursion,Javascript,Node.js,Recursion,在我的应用程序中,我为用户提供了启动循环递归函数的多个实例的能力。目前,每个函数将永远继续,我需要一种方法来显式结束每个函数。考虑到这一点,我想我需要保持一个正在运行的进程数组,为每个进程存储一个唯一的id,并将一个isRunning变量与之关联,但我无法完全理解如何实现这一点 每当用户向my API发送帖子时,服务器端的这个函数就会从前端调用,并将继续以随机间隔调用自己 function scrapeAtRandomInterval(id, search_terms, category, lo

在我的应用程序中,我为用户提供了启动循环递归函数的多个实例的能力。目前,每个函数将永远继续,我需要一种方法来显式结束每个函数。考虑到这一点,我想我需要保持一个正在运行的进程数组,为每个进程存储一个唯一的id,并将一个isRunning变量与之关联,但我无法完全理解如何实现这一点

每当用户向my API发送帖子时,服务器端的这个函数就会从前端调用,并将继续以随机间隔调用自己

function scrapeAtRandomInterval(id, search_terms, category, location, min, max) {

  // Not currently using the id param as I don't need it for anything on the server side but thought it might come in handy to solve this issue.

  scrape(location, category, search_terms, min, max);

  var rand = randomIntBetweenBounds(0, 3600000 / 3);
  setTimeout(function() {
    scrapeAtRandomInterval(id, search_terms, category, location, min, max);  
  }, rand);  
} 
当用户发出删除请求时,我需要一种方法来停止与调用该函数的POST相关联的函数调用。再一次,我想象通过引用一个对象数组,每个对象都有一个id和一个bool标志,然后在函数内部我可以添加一个检查是否正在运行

我想象通过引用一个对象数组,每个对象都有id

搜索数组的平均速度为/2,将对象用作哈希表是O1,因此速度要快得多,因此使用数组是可行的,但对于许多正在运行的进程来说,速度很慢

。。。还有一个bool标志,然后在函数中我可以添加一个检查是否正在运行

更简单的是,您只需将计时器存储在id下,并在需要时取消,因为您需要一个对象来存储基于进程id的计时器id:

const timers = {};
然后,在设置新超时时,存储其id:

timers[id] = setTimeout(...);
然后,要清除它,只需执行以下操作:

clearTimeout(timers[id]);
delete timers[id]; // allow the engine to optimize the hashtable

如果希望能够停止当前正在运行的计时器,则需要将setTimeout返回的timerID存储在可以从外部访问的数据结构中。然后您可以在该timerID上调用clearTimeout。除非终止整个进程,否则没有其他方法停止计时器。这是一个很好的解决方案。如果优化哈希表很重要,我想知道删除计时器[id]是否是一个更好的方法。是的,这正是我要做的,我只是在实现上遇到了麻烦。我想我现在开始工作了,这很好。我是否应该从哈希表中完全删除id?为什么不使用Map对象?可以使用符号作为唯一键的键。