2013-05-13 76 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的新圖。