以前一直沒有弄懂 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)