如何从JavaScript外部停止递归循环功能?

时间:2018-07-15 16:30:21

标签: javascript node.js recursion

在我的应用程序中,我使用户能够启动循环递归函数的多个实例。当前,每个功能将永远持续下去,我需要一种明确结束每个功能的方法。考虑到这一点,我想我需要保留一个正在运行的进程数组,并为每个进程存储一个唯一的ID,并将一个isRunning变量与之关联,但是我不太想知道如何实现这一点。

每当用户对我的API进行POST时,都会从前端调用服务器端的此函数,并将继续以随机间隔进行调用。

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);  
} 

当用户发出DELETE请求时,我需要一种方法来停止与调用该函数的POST相关联的函数调用。再次,我想像是通过引用每个对象的数组,每个对象都带有id和bool标志,然后也许在函数内部我可以添加一个检查isRunning吗?

1 个答案:

答案 0 :(得分:1)

  

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

搜索数组的平均次数为O(n/2),将对象用作hashatable的搜索对象为O(1),因此搜索速度要快得多,因此使用数组是可行的,但速度较慢(对于许多正在运行的进程)。 / p>

  

...和一个bool标志,然后也许在函数内部我可以添加一个检查isRunning的内容。

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

const timers = {};

然后在设置新的超时时存储其ID:

timers[id] = setTimeout(...);

然后清除它,只需执行以下操作:

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