自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何存儲(chǔ)管理頁面 setTimeout & setInterval

開發(fā) 開發(fā)工具
在管理 setTimeout & setInterval 這兩個(gè) APIs 時(shí),筆者通常會(huì)在頂級(jí)(全局)作用域創(chuàng)建一個(gè)叫 timer 的對(duì)象,在它下面有兩個(gè)數(shù)組成員 —— {sto, siv},用它們來分別存儲(chǔ)需要管理的 setTimeoutID / setIntervalID。

[[205103]]

在管理 setTimeout & setInterval 這兩個(gè) APIs 時(shí),筆者通常會(huì)在***(全局)作用域創(chuàng)建一個(gè)叫 timer 的對(duì)象,在它下面有兩個(gè)數(shù)組成員 —— {sto, siv},用它們來分別存儲(chǔ)需要管理的 setTimeoutID / setIntervalID。如下:

  1. var timer = { 
  2.     sto: [],  
  3.     siv: [] 
  4. }; 

在使用 setTimeout / setInterval 的時(shí)候,這樣調(diào)用:

  1. // 標(biāo)記 setTimeoutID 
  2. timer.sto.push( 
  3.     setTimeout(function() {console.log("3s")}, 3000);  
  4. );  
  5. // 標(biāo)記 setIntervalID 
  6. timer.siv.push( 
  7.     setInterval(function() {console.log("1s")}, 1000) 
  8. ); 

在頁面需要 clearTimeout \ clearInterval 的時(shí)候,這樣調(diào)用:

  1. // 批量清除 setTimeout 
  2. timer.sto.forEach(function(sto) {clearTimeout(sto)});  
  3. // 批量清除 setInterval 
  4. timer.siv.forEach(function(siv) {clearInterval(siv)}); 

暫停 & 恢復(fù)

近段時(shí)間,筆者發(fā)現(xiàn)很多業(yè)務(wù)都需要「暫?!购汀富謴?fù)」setTimeout & setInterval 的功能,而僅靠原生的四個(gè) APIs(setTimeout / setIntervale / clearTimeout / clearInterval)是不夠用的。于是,筆者對(duì) timer 進(jìn)行了擴(kuò)展,使它具備了「暫?!购汀富謴?fù)」的功能,如下:

  1. // 暫停所有的 setTimeout & setInterval 
  2. timer.pause();  
  3. // 恢復(fù)所有的 setTimeout & setInterval 
  4. timer.resume(); 

擴(kuò)展后的 timer對(duì)象下面掛載6個(gè)基礎(chǔ)的 APIs。

  • setTimeout
  • setInterval
  • clearTimeout
  • clearInterval
  • pause
  • resume

使用 timer.set* & timer.clear* 來代替原生的 set* & clear*。筆者把擴(kuò)展后的 timer 托管在 GitHub 倉庫上,有興趣的同學(xué)可以移步:https://github.com/leeenx/timer

CreateJS 的啟發(fā)

在使用 CreateJS 開發(fā)一些項(xiàng)目的過程中,筆者發(fā)現(xiàn)通過設(shè)置 createjs.Ticker.paused = true / false,可以暫停/恢復(fù) createjs.Tween 上的動(dòng)畫。于是筆者借用 createjs.Tween 模擬了 setTimeout & setInterval 的功能,如下:

  1. // setTimeout 
  2. createjs.setTimeout = function(fn, delay) { 
  3.     createjs.Tween.get().wait(delay).call(fn); 
  4. //setInterval 
  5. createjs.setInterval = function(fn, delay) { 
  6.     createjs.Tween.get().wait(delay).call(fn).loop = 1;  

具體的代碼筆者托管在:createjs.timer。

其實(shí)就是在 createjs 對(duì)象下掛載四個(gè) APIs:

  • setTimeout
  • setInterval
  • clearTimeout
  • clearInterval

使用方法與原生的 setTimeout & setInterval 一樣,如下:

  1. let siv = createjs.setInterval(() => console.log("1s"), 1000); 
  2. createjs.setTimeout(() => createjs.clearInterval(siv), 5000); 

時(shí)間軸驅(qū)動(dòng)的 timer

createjs.timer 在 CreateJS 項(xiàng)目的開發(fā)給筆者帶來了極大的便利,但是它必須依賴 createjs.Tween 模塊。于是筆者就在思考能否創(chuàng)建一個(gè)跟第三方框架無關(guān)并且又可以在第三方框架上使用的 timer。

createjs.Ticker.paused 為什么能暫停 createjs.Tween 上的動(dòng)畫的?

createjs.Tween 中每一個(gè)動(dòng)畫都有一條自己的時(shí)間軸,這條時(shí)間軸是通過 createjs.Ticker 來驅(qū)動(dòng)的;當(dāng) createjs.Ticker 被暫停后,createjs.Tween 中的每個(gè)動(dòng)畫的時(shí)間軸也會(huì)失去動(dòng)力而暫停下來。

createjs.Ticker 的作用是提供一個(gè)刷新 canvas 畫面幀頻,通常是使用 requestAnimationFrame or setInterval 來實(shí)現(xiàn)的。如果 timer 內(nèi)部存在一條時(shí)間軸,這條時(shí)間軸由第三方驅(qū)動(dòng),那么 timer 就可以與第三方框架狀態(tài)同步了。

筆者是這樣設(shè)計(jì) timer 的結(jié)構(gòu):

  • queue —— 存放 setTimeout or setInterval 的隊(duì)列;
  • updateQueue —— 驅(qū)動(dòng) queue 的內(nèi)部 API;
  • update —— 外部接口,用于對(duì)接第三方 Ticker。

實(shí)現(xiàn)的偽代碼如下:

  1. /* 
  2.     @queue 成員的結(jié)構(gòu)如下: 
  3.     { 
  4.         fn: fn, // 回調(diào)函數(shù)  
  5.         type: "timeout or interval", // 類型  
  6.         elapsed: 0, // 時(shí)間軸進(jìn)度 
  7.         delay: delay // 目標(biāo)時(shí)長(zhǎng) 
  8.     } 
  9. */ 
  10. let queue = new Map();  
  11. function updateQueue(delta) { 
  12.     queue.forEach((item, id) => {  
  13.         item.elapsed += delta;  
  14.         if(item.elapsed >= item.delay) { 
  15.             item.fn();  
  16.             // 從 queue 中刪除 setTimeout 成員,interval 成員繼續(xù)循環(huán) 
  17.             item.type === "timeout" ? delete(id) : (item.elapsed = 0);  
  18.         }  
  19.     });  
  20. // 對(duì)外接口 
  21. this.update = function(delta) { 
  22.     updateQueue(delta);  

timer 的具體實(shí)現(xiàn)可以參考:https://github.com/leeenx/es6-utils#timer

timer 與 CreateJS 一起使用:

  1. // es6 代碼 
  2. import timer from './modules/timer';  
  3. // 統(tǒng)一 ticker 
  4. createjs.Ticker.addEventListener("tick"function(e) { 
  5.   e.paused || timer.update(e.delta);  
  6. }); 

timer 與 PIXI 一起使用:

  1. // es6 代碼 
  2. import timer from './modules/timer';  
  3. // 統(tǒng)一 ticker 
  4. app.ticker.add("tick"function() { 
  5.   timer.update(app.ticker.elapsedMS);  
  6. }); 

原文鏈接:https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/

作者:leeenx

【本文是51CTO專欄作者“凹凸實(shí)驗(yàn)室”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過51CTO聯(lián)系原作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2013-03-08 09:33:25

JavaScript同步異步

2017-11-01 14:29:38

2010-05-05 11:45:20

虛擬化

2020-03-27 22:18:55

JavaScript編程語言代碼

2025-04-11 08:42:37

JavaScript倒計(jì)時(shí)前端

2022-06-20 07:44:34

ahooks定時(shí)器

2013-08-23 10:30:41

虛擬桌面虛擬快照

2013-07-03 09:42:06

桌面虛擬化存儲(chǔ)

2024-10-16 08:36:03

2021-04-21 09:28:17

字節(jié)面試官SetTimeout

2020-05-28 10:53:32

存儲(chǔ)數(shù)據(jù)框架

2021-01-13 10:51:08

PromissetTimeout(函數(shù)

2022-08-14 14:52:45

數(shù)據(jù)存儲(chǔ)實(shí)踐

2021-05-18 08:30:42

JavaScript 前端JavaScript時(shí)

2010-09-27 15:58:51

SQL存儲(chǔ)過程

2018-03-20 10:37:33

存儲(chǔ)大數(shù)據(jù)管理

2011-07-05 09:56:02

服務(wù)器虛擬化數(shù)據(jù)存儲(chǔ)

2020-10-26 10:48:30

人工智能大數(shù)據(jù)存儲(chǔ)管理效率

2020-12-08 14:20:43

人工智能數(shù)據(jù)存儲(chǔ)

2011-10-26 11:21:47

服務(wù)器虛擬化存儲(chǔ)管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)