2014-06-20 93 views
0

我在寫一個聊天應用程序,它可以一次打開多個聊天窗口。每次打開一個窗口時,我都會在我的函數update_chat()上調用setInterval來更新單個聊天窗口。我通過chat_id到update_chat()具有參數的函數的clearTimeout

setInterval("update_chat("+chat_id+")",4000); 

chat_id是聊天的只是ID。因此,我可以根據打開多少個聊天,以不同的時間間隔多次運行功能update_chat。開始聊天工作正常。

我的主要問題是如何停止上述時間間隔。我不想停止所有間隔,只是與特定聊天相關聯的間隔。我試過這個

clearInterval("update_chat("+chat_id+")"); 

但它沒有做任何事情。


我試圖

var chat_intervals=[]

chat_intervals[chat_id]=setInterval("update_chat("+chat_id+")",4000);

clearInterval(chat_intervals[end_id]);

它沒有停止間隔

+0

不要將字符串傳遞到'setInterval'! –

+0

@Derek朕會功夫爲什麼不呢?我必須通過該函數的一個參數。我還可以如何獲得該函數的參數? – Gilberg

+0

因爲傳遞一個字符串與使用'eval'相同。傳遞參數的正確(安全)方式是在其周圍包裝一個匿名函數。 –

回答

4

clearIntervaldocs)噸以區間ID作爲參數來知道要清除哪個區間。 setIntervaldocs)在調用時會返回一個間隔ID,因此您將其存儲在var中,並在需要清除時將其傳遞到clearInterval

//start the interval, store its ID 
var interval_id = setInterval(function() { /* do something*/ }, 1000); 

//clear the interval 
clearInterval(interval_id); 

注意setTimeoutdocs)和clearTimeoutdocs)以同樣的方式互相合作。

另請注意,儘管setInterval可以將字符串參數作爲要運行的函數,但它也可能需要實際的函數(這是非常優選的)。因此,您的代碼可能會寫得更好:

var update_chat_interval = setInterval(function() { 
    update_chat(chat_id); 
}, 4000); 

// to clear it later: 
clearInterval(update_chat_interval); 
+0

你可以看看我的更新 – Gilberg

+1

@Gilberg在你更新的代碼中,你將ID設置爲'chat_intervals [chat_id]',但是你將'chat_intervals [end_id]'返回給'clearInterval'。爲了清楚起見,您使用了** chat_id **然後** end_id **。另外,在你對這個問題的評論中,你問過如何避免將字符串傳遞給'setTimeout'和'setInterval'。我答案的最後部分告訴你如何。 – JAAulde