代码之家  ›  专栏  ›  技术社区  ›  Taylor A. Leach

如何在javascript中从外部停止递归循环函数?

  •  0
  • Taylor A. Leach  · 技术社区  · 6 年前

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

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

    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标志),然后在函数内部添加一个检查(如果正在运行)?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Wilms    6 年前

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

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

    …和一个bool标志,然后在函数内部添加一个检查,如果正在运行?

    或者更简单地说,您只需将计时器存储在ID下,并在需要时取消它,因为您需要一个对象来基于进程ID存储计时器ID:

    const timers = {};
    

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

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

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

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