2014-06-29 95 views
2

在清除嵌套在另一個setInterval中的setInterval時遇到一些問題。清除嵌套的setInterval?

polling被清除得很好,但是marque(全局設置)會持續點亮,即使清除會在控制檯中多次吐出。

listener: function() { 
    var polling; 

    journalScroll.on('scrollEnd', function() { 
     clearInterval(polling); 
     Roots.common.journal.scroll.status(); 
     console.log('scrollend'); 
    }); 

    journalScroll.on('scrollStart', function() { 
     polling = setInterval(Roots.common.journal.scroll.status, 1250); // Time in milliseconds 
     console.log('scrollstart'); 
    }); 
}, 

status: function() { 
    console.log('scroll status'); 

    if((journalScroll.y*-1) < $(window).height() * 3) { 
    console.log('setinterval'); 
    marque = setInterval(function() { 
     Roots.common.journal.scroll.marque(); 
    }, 50); 
    } else { 
    clearInterval(marque); 
    console.log('cleared'); 
    } 
}, 

marque: function() { 
    console.log('polling marque');   
}, 
+0

您可以插入一個檢查來查看是否已將間隔分配給marque,如果是,請在添加新的間隔之前將其清除。 – Nit

+0

我剛剛在setInterval之前與清除。不是最乾淨的方式,但做到了。謝謝。 (@使者,也許增加它作爲答案,所以我可以接受它?) – INT

回答

2

setInterval只是返回一個ID(整數),將試圖無限期地運行一個計時器,直到你通過相同的ID回clearInterval功能。由於事件異步的相對不可預知性功能,調用和回調往往導致race conditions

例如,您的代碼可能會創建一個新的時間間隔,並在清除舊時間間隔之前爲marque變量分配一個不同的ID - 這會導致它處於「孤立」狀態,因爲它仍在運行,並且您沒有ID取消它。

沒有看到所有的代碼的問題將是盲目clearInterval(marque);setInterval前將status功能「固定」的最簡單的方法 - 確保此情況下,只有一個間隔是在任何時間點主動。