Javascript 如何删除settimeOut的队列工作?

Javascript 如何删除settimeOut的队列工作?,javascript,angularjs,Javascript,Angularjs,clearTimeout(tt)后,tt=setTimeout(函数(){停止工作。为什么?我有递归,当我手动执行getByClients时,我需要删除setTimeout的当前队列(如果存在)并执行新的setTimeout,而不是在clearTimeout(tt);我什么都没有得到 var tt = undefined; // in default select = null, only by btn click='getByClients(1)' function getByClients(

clearTimeout(tt)后
tt=setTimeout(函数(){
停止工作。为什么?我有递归,当我手动执行getByClients时,我需要删除setTimeout的当前队列(如果存在)并执行新的setTimeout,而不是在
clearTimeout(tt);
我什么都没有得到

var tt = undefined;
// in default select = null, only by btn click='getByClients(1)'
function getByClients(select) {

  if (select == 1 || select == 2) {
    clearTimeout(tt); // after, setTimeout is not executed 
  }

    dashboardService.getByClients($scope.clientsMode).then(function(response) {
        tt = setTimeout(function() {
          getByClients(null);
        }, refreshTime);

  });
};

请帮帮忙(

我不认为需要递归代码。也许你的示例太简单了? 如果我理解正确,您需要每X秒自动呼叫一次服务,但您希望能够强制立即呼叫。 在这种情况下,我会这样做:

var tt = null;


// - Stop current timer (is started)
function stopTimeout()
{
    if(tt)
  {
        clearTimeout(tt); 
    tt = null;
  }
}


// - Start a new Timer (and stops the previous one if any)
function startTimeout()
{
        stopTimeout(); // - to clean if already started (security)

    tt = setTimeout(function() {
          getByClients();
    }, refreshTime);
}


function getByClients()
{
    // - Stop automatic Timer
    stopTimeout();

  // - Executes Query
    dashboardService.getByClients($scope.clientsMode).then(function(response) {
        // - "Read response "

    // - Restart timer
    startTimeout();

        }
    );
}

// - Start automatic calls
getByClients();
在这种情况下不需要参数:每次调用都会停止当前超时。 我认为更好的方法是使用setInterval,但我想接近您的原始代码

我的示例代码在手动更新后重新启动自动更新。我不知道这是否是您的需要


编辑:我看到您使用AngularJS,也许$timeout更适合您的需要?

递归在JavaScript中通常不是一个好主意,这就是为什么他们创建了set timeout和for循环。此外,您从不调用初始GetByClient,因此它从一开始就不会运行,在第二个实例中,当它只有1时,您会传递两个参数。还有您的if语句不是if-else语句,这意味着对于您给定的所有代码,完全有可能在setTimeout被重置之后重置它cleared@Binvention,未删除函数的参数,用于显示example@Binvention“递归在JavaScript中通常不是一个好主意,这就是为什么他们创建了set timeout和for循环。”这根本不是真的。只是在编写递归代码时必须小心。从技术上讲,仔细观察,这根本不是递归。因为then函数意味着回调,这意味着它没有同步运行。因此GetByClient不是用自身定义的,而是回调函数包含它。递归变成了当函数同步调用自身时是危险的,因为在第一个函数完成之前,同一个函数的多个实例正在运行,但这里的情况并非如此,第一个函数可以在不依赖第二个函数的情况下完成instance@AxOn关于你的问题的另一件事是它不包含在这个代码中在正确的外部环境下,这里可以工作,尽管假设您的仪表板服务总是解决而不是拒绝,这将在刷新时间间隔内持续运行,因为即使清除超时,仪表板服务也会再次初始化它,因此它只是比正常情况下的延迟更长。他希望刷新时间间隔点击一个按钮就会停止。