2013-05-13 74 views
0

我生成多个图表,每个图表都有自己的setInterval来刷新数据。我已经将它设置为clearInterval当动态生成的容器被删除 - 但如果我重新加载,并且它具有相同的ID旧setInterval继续运行。有没有办法设置一个动态命名的setInterval,可以在生成替换时停止?停止动态生成setInterval

现在我使用:

function generateChart(data, location){ 
    var chart = new Highcharts.Chart({ 
     // blah blah blah 
    }, function(chart){ 
     setInterval(function(){ 
      if($('#'+location).length){ 
       // I'm doing stuff every minute 
      }else{ 
       clearInterval(); 
      } 
     },60000); 
    }); 
} 

会发生什么情况是,该位置是随机生成的字符串,成为了Highchart容器中的元素ID,如果他们用户保存图表就变成了唯一标识符。如果用户更新已保存的图表并重新加载图表,则旧图标将获得.removed(),并在其位置生成新图表。现在,新元素具有与旧元素相同的元素ID,并且由于旧时间间隔发现它想要的容器,它会尝试继续更新 - 这是因为它的图表变为无效。

有没有办法设置一个动态变量我可以使用setInterval,以便我可以clearInterval吗?

var blob+location = setInterval(function(){ ... 

然后

clearInterval(blob+location); 
+0

请看看我用这个小例子来解释你setTimeout和关闭的东西http://jsfiddle.net/coma/vECyv/ – coma 2013-05-13 22:53:14

+0

你的例子只有当我有有限次数我需要它运行 - 我需要它继续运行,直到取消或不存在。 – jbolanos 2013-05-13 23:08:24

+0

哼哼......让我来几分钟... – coma 2013-05-13 23:11:14

回答

2

你可以只使用一个对象:使用的setInterval

var myObj = {}; 

var location = "somevalue"; 

myObj[location] = setInterval(... 

clearInterval(myObj[location]); 
+0

我可以在一个单独的函数中使用$('#'+ location).remove(); ? – jbolanos 2013-05-13 22:35:14

+0

你想要达到什么目的? 'myObj'只是一个对象,所以你可以随意移动它,就像 – Kenneth 2013-05-13 22:37:40

+0

一样,只要图表存在,图表必须每分钟更新一次。如果图表被删除或被替换为具有更新标题的相同图表(例如),旧的setInterval需要消失,以支持新的图标(因为两个测试都针对相同的容器ID – jbolanos 2013-05-13 22:43:22

0

停止,使用的setTimeout代替(How do I execute a piece of code no more than every X minutes?):

function generateChart(data, location) { 

    var element = $('#'+location); 

    var chart = new Highcharts.Chart({ 
     // blah blah blah 
    }, foo); 

    var foo = function() { 

     if(element){ 

      // I'm doing stuff every minute 

      setTimeout(foo, 6000); 
     } 

    }; 

} 

停止它,只是避免集合超时或使element = null

也许我的代码有点不对(我现在正在睡觉),但事情是使用setTimeout和闭包。

如果在foo里,某件东西的时间超过6秒,您将会遇到麻烦,因为setTimeinterval会再次调用它,请观看http://www.youtube.com/watch?feature=player_detailpage&v=i_qE1iAmjFg#t=462s,这样,您可以确保这将在最后一次完成的东西后6秒运行。

我会在这里让这个例子给后人:

http://jsfiddle.net/coma/vECyv/2/

var closure = function(id) { 

    var n = 0; 
    var go = true; 

    $('#' + id).one('click', function(event) { 

     go = false; 

    }); 

    var foo = function() { 

     if(go) { 

      console.log(id, n++); 
      setTimeout(foo, 1000); 

     } 

    }; 

    foo(); 
}; 

closure('a'); 
closure('b'); 
+0

不设置TimeTime只运行一次吗?我需要它继续运行,我希望它每分钟更新一次图表 - 不要继续创建新的。 – jbolanos 2013-05-13 22:44:32

+0

每次调用** foo **时,都会将自己绑定到另一个setTimeout,如果元素中没有** falsy **。 – coma 2013-05-13 22:45:43

0

行 - 因为我似乎无法环绕你的一些答案,我决定去低技术我的头。

function genToken(){ 
    var num = Math.floor(Math.random() * 10000); 
    var token = 't-' + num; 
    return token; 
} 

function genLocation(){ 
    var chartToken = genToken(); 
    var newChart = '<div id="'+location+'" data-token="'+chartToken+'"></div>'; 
    $('#chartHome').append(newChart); 
} 

// inside my chart function 

var token = $('#'+location).data('token'); 
setInterval(function(){ 
    if($('[data-token="'+token+'"]').length){ 
     // still there - keep going 
    }else{ 
     // all gone - time to stop 
     clearInterval(); 
    } 
},60000); 

现在,当我做:

$('#'+location).remove(); 

令牌也消失,不会是相同的,如果我生成相同的位置ID的新图。