clearInterval逻辑问题

时间:2015-07-20 18:52:47

标签: javascript ajax

我遇到了清除我正在使用的逻辑中的间隔的问题。 clearInterval没有像我想象的那样工作。关于如何将我的logiuc合并到如下clearInterval的任何建议都可行吗?更改时会调用toggleInterval。

var interval;
function toggleInterval(setting, interval) {
      switch (setting) {
          case SET_INTERVAL: 
            interval = setInterval(function() {
                poll(true, interval);
            }, 5000);  
            break;
        case CLEAR_INTERVAL:
            clearInterval(interval);
            break;    
    }   
}   


function poll(polled, interval) {
    if (!polled) {
        $pollPromise = $.ajax({
            url: '/stuff/',
        }); 

        $pollPromise.done(success);
        function success(data) {
            if (data.success) {
                // .... DO stuff
                toggleInterval(CLEAR_INTERVAL, interval);
            }   
            return;
        } 
    }   
}   

2 个答案:

答案 0 :(得分:1)

当调用设置的间隔时,您将创建一个新的轮询间隔。 您需要先清除间隔,然后再创建一个新间隔。

    private void EnableProfiling(string profilerConnection)
    {
        using (var conn = new SqlConnection(profilerConnection))
        {
            conn.Open();
            var miniProfilersTableExists = conn.ExecuteScalar<int>("select case when exists((select * from information_schema.tables where table_name = 'MiniProfilers')) then 1 else 0 end");
            if (miniProfilersTableExists != 1)
                conn.Execute(SqlServerStorage.TableCreationScript);
        }
        Profiler.Settings.Storage = new SqlServerStorage(profilerConnection);          
    }

应改为

case SET_INTERVAL: 
            interval = setInterval(function() {
                poll(true, interval);
            }, 5000);  
            break;

答案 1 :(得分:1)

您实际上并未将setInterval()值存储在任何位置。

您的interval参数(局部变量)会隐藏var interval;声明,因此一旦toggleInterval()退出,该值就会丢失。返回值,以便调用者可以使用它来设置全局变量:

var interval;

function toggleInterval(setting, interval) {
      switch (setting) {
          case SET_INTERVAL: 
            return setInterval(function() {
                poll(true, interval);
            }, 5000);  

        case CLEAR_INTERVAL:
            clearInterval(interval);
            break;    
    }   
}       

function poll(polled, interval) {
    if (!polled) {
        $pollPromise = $.ajax({
            url: '/stuff/',
        }); 

        $pollPromise.done(success);
        function success(data) {
            if (data.success) {
                // .... DO stuff
                toggleInterval(CLEAR_INTERVAL, interval);
                interval = null;
            }   
            return;
        } 
    }   
}   

// elsewhere:
interval = toggleInterval(SET_INTERVAL);