在我的应用程序中,我使用户能够启动循环递归函数的多个实例。当前,每个功能将永远持续下去,我需要一种明确结束每个功能的方法。考虑到这一点,我想我需要保留一个正在运行的进程数组,并为每个进程存储一个唯一的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吗?
答案 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