淺談setTimeout和setInterval

以前一直沒有弄懂 setTimeout 和 setInterval,現在遇到一個題目,查了許久,記錄下來方便之後查看。javascript

setTimeout :mdn解釋該方法設置一個定時器,該定時器在定時器到期後執行一個函數或指定的一段代碼。java

setInterval:方法重複調用一個函數或執行一個代碼段,在每次調用之間具備固定的時間延遲。函數

以前認爲二者的區別就是一個只是運行一次,另外一個一直運行,如今看來太天真; 對象

通常的場景下使用兩種方法沒有問題,可是遇到一個事情,就是在定時器中調用一個接口,判斷用戶是否掃碼登錄。blog

仔細排查了,是由於我使用了setInterval,都說setTimeout 不許確,其實setInterval 在某些狀況也不許確,在時間上,setInterval 是很準確可是,他不會管其餘的事情,到點就下班。。。。接口

 

假設有個函數須要調用,返回爲true的時候,中止定時器。ip

setInterval 會按照固定時間容許該函數,若是這個函數超時了,那麼在n次中就會忽略改函數的返回true,在某些應用場景中這是致命的io

setTimeout  的不許確也是會由於該函數超時了,以前也沒有調用方法console

 

上個栗子這樣看的就直觀了不少function

/**
         * 一、從 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一個數字,每次數字增幅爲 1
         * 二、返回的對象中須要包含一個 cancel 方法,用於中止定時操做
         * 三、第一個數須要當即輸出
         **/
        function count(start, end) {
            if (start <= end) {
                console.log(start);
                start++;
                st = setTimeout(function() {
                    count(start, end);
                }, 1000)
            };
            return {
                cancel: function() {
                    clearTimeout(st)
                }
            }
        }
        count(1, 10)
相關文章
相關標籤/搜索