如何删除settimeOut的队列工作?

时间:2016-03-21 14:15:39

标签: javascript angularjs

clearTimeout(tt);后,tt = setTimeout(function () {停止工作。为什么?我有递归,当我手动执行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);

  });
};

帮助,请某人(

1 个答案:

答案 0 :(得分:1)

我不认为需要递归代码。也许你的样本太简单了? 如果我理解正确,您需要每隔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();

在这种情况下,不需要参数:每次调用都会停止当前的timeOut。 我认为更好的方法是使用setInterval,但我想要接近原始代码。

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

编辑:我看到你使用AngularJS,或许超时会更符合你的需求吗?