2014-09-03 32 views
0

我是JavaScript新手,我仍然習慣於它的工作方式。我有一個繪製實時曲線圖,是不斷從數據庫中查詢到的數據更新的功能,用下面的代碼完成:停止在javascript中延遲執行實時圖形繪圖

watch = setTimeout(function() { 
    updateGraph(parameters, ...); 
    },updateTimeInterval); 

圖表更新需要一些時間來執行,並且,當然也要看關於updateTimeInterval的值。例如,如果updateTimeInterval設置爲1000 ms,則繪圖將在8 s內(每個平均值)更新一個新值,而如果設置爲5000 ms,繪圖將在15 s內更新。

此更新發生,直到按停止按鈕停止繪圖過程。

function stopPlotting() { 
    clearTimeout(watch); 
    } 

這正常工作只有在按下停止按鈕在正確的時刻,即setTimeout的內部函數的執行開始前。在我看來,由於延遲執行此功能,事情變得更加複雜。 當然,人們希望繪圖只需按下停止按鈕即可自動停止,而不必等待「正確」的時刻。有沒有什麼辦法可以通過JavaScript實現?我找不到解決這個問題的辦法。謝謝!

編輯:

updateGraph()是在其中數據被從數據庫中檢索的功能。只要有數據,函數就會用最新的信息重新繪製(更新)圖形。根據setTimeout指定的時間延遲,這種情況會持續發生。圖表將被永久更新,直到有人按下該停止按鈕。

編輯2:

我已經在返回false updateGraph()函數幾個地方設置一個標誌,如果標誌值發生更改。在clearTimeout()之前,該標誌的值在stopPlotting()函數中更改。這實際上做了訣竅,停止了圖的繪製。

但是,出現了一個新問題:如果現在我想從頭開始重新繪製圖形,這是不可能的。這是因爲該標誌的值已經被更改,並且它在updateGraph()函數中將始終返回false,因此不會繪製任何內容。你有什麼暗示嗎?

EDIT3:

該提示是改變另一個布爾變量在stopPlotting()函數,和在updateGraph(),以檢查是否值已被改變(如果是這樣,交替標誌的值)。這將允許根據需要從頭開始繪製圖形。 P.S.布爾變量和標誌都被聲明爲全局變量。

+0

'updateGraph()'中會發生什麼?你可以在'stopPlotting()'中設置一個標誌,並在'updateGraph()'中的不同位置檢查它,並在需要時進行解救。 – 2014-09-03 21:08:35

+0

1000毫秒應該是一秒鐘。那是什麼? – PHPglue 2014-09-03 21:26:13

+0

應該'setInterval'從數據庫中反覆獲取信息。請解釋。 – PHPglue 2014-09-03 22:01:42

回答

0

一旦超時功能被觸發,船就航行了。超時功能僅適用於觸發功能,不能控制它們。

如果要停止該功能,可以使用在腳本的時間敏感部分(即ajax調用)上檢查的變量。

var running = true; 
function dummy(){ 
    if(! running) return false; 
    runThis(); 
    if(! running) return false; 
    runThat(); 
    //finish when there's no interference (running is set to false) 
} 
+0

解決方案你沒有setTimeout()和clearTimeout()?問題在於,繪製圖表應該持續無限,直到有人按下停止按鈕。我不知道如何將其包含在我的updateGraph()函數中。 – BenjieB 2014-09-04 08:22:04

+0

你仍然保持超時功能,因爲你必須無限地運行你的繪圖。你的問題是,一旦你的繪圖功能正在運行,那麼清除超時將不會停止你的繪圖功能。想象一下足球運動員的超時時間。你可以告訴他不要踢球。但是一旦他踢球了,他就沒有辦法阻止球。除非有什麼東西讓球停下來。 – aldux 2014-09-05 14:35:23