首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在JavaScript中停止来自外部的递归循环函数?

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

Stack Overflow用户
提问于 2018-07-16 00:30:21
回答 1查看 56关注 0票数 0

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

每当用户向我的API发出POST时,服务器端的这个函数get就会从前端调用,并且会以随机的间隔继续调用自己。

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-16 00:34:00

我想象一下,通过引用一个对象数组,每个对象的id都是...

搜索数组是O(n/2)的平均值,使用对象作为散列表是O(1),因此速度快得多,所以使用数组是可行的,但它很慢(对于许多正在运行的进程)。

...和一个布尔标志,然后在函数内部,我可以添加一个检查,如果是isRunning?

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

代码语言:javascript
复制
const timers = {};

然后,当设置新的超时时,存储它的id:

代码语言:javascript
复制
timers[id] = setTimeout(...);

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

代码语言:javascript
复制
clearTimeout(timers[id]);
delete timers[id]; // allow the engine to optimize the hashtable
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51350157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档