沒任務就停止,有任務就依序執行的小功能分享

閱讀時間約 4 分鐘

使用場景

在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。

依序執行不斷產生的任務

依序執行不斷產生的任務


實現過程

打造一個類別(Executor),裡面有一個對外函式(recordData),會把使用者加入的任務不斷加入陣列內。這裡為了方便,讓使用者傳入字串,自動把字串變成過兩秒會印在console的任務函式。

class Executor {
constructor() {
this.pendingFunctionArray = [];
}

recordFunction = async (string) => {
await new Promise((resolve) => setTimeout(resolve, 2000));
console.log(`${string} finish`);
};

recordData = (string) => {
this.pendingFunctionArray.push(() => recordFunction(string));
}
}


加入一個函式,裡面有個回圈會依序執行任務。每次使用者呼叫recordData加入任務,就會呼叫這個函式,讓這個函式不斷執行,直到任務完成後停止。

class Executor {
constructor() {
this.pendingFunctionArray = [];
}

recordFunction = async (string) => {
await new Promise((resolve) => setTimeout(resolve, 2000));
console.log(`${string} finish`);
};

recordData = (string) => {
this.pendingFunctionArray.push(() => recordFunction(string));
this.scheduleTasks();
};

scheduleTasks = async () => {
while (true) {
if (this.pendingFunctionArray.length == 0) break;

const recordFunction = this.pendingFunctionArray.shift();
await recordFunction();
}
};
}


但這樣會產生多個scheduleTasks函式同時執行,可能產生預期外的結果。可以加入一個參數isExecuting來判斷,確保只有一個scheduleTasks函式在執行。

class Executor {
constructor() {
/**@type {Function[]} 待處理陣列 */
this.pendingFunctionArray = [];
/**是否正在排程執行任務 */
this.isExecuting = false;
}

recordFunction = async (string) => {
await new Promise((resolve) => setTimeout(resolve, 2000));
console.log(`${string} finish`);
};

recordData = (string) => {
this.pendingFunctionArray.push(() => recordFunction(string));
this.scheduleTasks();
};

scheduleTasks = async () => {
if (this.isExecuting) return;

this.isExecuting = true;
while (true) {
if (this.pendingFunctionArray.length == 0) {
this.isExecuting = false;
break;
}

const recordFunction = this.pendingFunctionArray.shift();
await recordFunction();
}
};
}


最後附上在線demo的鏈接:依序執行不斷產生的任務

avatar-img
4會員
9內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
s_SoNg的沙龍 的其他內容
ThreeJS ArcballControl呼叫update方法後,視角被翻轉問題的解決記錄
setter和getter能把狀態改變時需做的事情包裝起來,讓外部只需簡單修改參數就能達到預想的效果
在程式任何地方都能修改各種react組件狀態的做法分享
網格擴散可以就像剪紙一樣,把紙上想要的部分剪下來。 通過模型的一個點,找到周圍相鄰的點;其他點又能找到周圍相鄰的點,就像水波一樣擴散出去。 許多3D的算法,如裁切、干涉深度偵測等都會用到。
在THREE r125版本開始,THREE.Geometry就被棄用。 自己的職位是IT前端,由於套件安全性的原因,需要對THREE套件進行升級,但自己所在公司的程式內還有大量的Geometry。 因為前輩們開發了一些複雜強大的算法,如果用Threejs官方建議的正規方法,自己必須要看懂並且改寫算法
ThreeJS ArcballControl呼叫update方法後,視角被翻轉問題的解決記錄
setter和getter能把狀態改變時需做的事情包裝起來,讓外部只需簡單修改參數就能達到預想的效果
在程式任何地方都能修改各種react組件狀態的做法分享
網格擴散可以就像剪紙一樣,把紙上想要的部分剪下來。 通過模型的一個點,找到周圍相鄰的點;其他點又能找到周圍相鄰的點,就像水波一樣擴散出去。 許多3D的算法,如裁切、干涉深度偵測等都會用到。
在THREE r125版本開始,THREE.Geometry就被棄用。 自己的職位是IT前端,由於套件安全性的原因,需要對THREE套件進行升級,但自己所在公司的程式內還有大量的Geometry。 因為前輩們開發了一些複雜強大的算法,如果用Threejs官方建議的正規方法,自己必須要看懂並且改寫算法
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
按照慣例,帶有惡搞性質、以頒發最差電影頭銜為聞名的金酸莓獎都會選擇在奧斯卡金像獎前夕搶先公佈入圍名單,其中由動作巨星史泰龍領軍的系列電影《浴血任務4》不幸以最差電影、最差導演等七大獎項提名,成為今年(2024)第 44 屆金酸莓獎入圍階段的最大輸家。
Thumbnail
今天和大家分享一件由真實事件改編的故事,有次,美軍需要在初佔領的敵對國家興建軍用機場,興建機場需要發電系統,美軍需要想方法將發電機送至當地。然而,美軍大本營距離這佔領地區距離甚遠,中間只有少量美軍駐守,所以從陸路運輸發電機是沒有可能的。於是,美軍決定求助於各大運輸公司,由於飛行距離遠,加上途中全
Thumbnail
這次既然介紹了兩位我心目中《如果不是這個演員,便無法成就這部電影》的《丹尼爾雷德克里夫(Daniel Radcliffe)》以及《布蘭登·費雪 (Brendan James Fraser)》。 當然,我們絕對不能錯過那位被眾人視為神秘人物的《基努·查爾斯·李維 》
Thumbnail
格拉蒙侯爵(比爾史柯斯嘉)說:這世界上有三種人,為了目標而活的人,為了目標而死的人,為了殺戮而活的人;肯恩是三種都有,約翰維克是三種皆無。
Thumbnail
「沒有計畫,就沒有計畫失敗。」 沒有規劃時間也是。 剛開始要時間管理,一定會找一個行事曆app 一開始很熱情,把它排的滿滿的。 覺得自己就是一位時間管理大師。(我說我 然後發現中間沒空檔不行。 你會去上廁所,你會有突發狀況。 剛開始的我就是這麼安排的。 你會發現,開始跟不上,開始趕行程。 忙了一整天
Thumbnail
許久不見,過了好一些日子沒有上來寫寫東西,在這個短短的半個月中,我的生活起了一些變化,大家有過那種想盡辦法卻找不到一個方法的經驗嗎?
Thumbnail
2013 年,為 SUBARU 台灣意美汽車第一年開始舉辦「Brand Day」活動,不同於一般車商將活動辦在室內,SUBARU 的主打形象是「戶外特質」,因此將活動場地定為「戶外」。而 2017 年,SUBARU 進駐台灣第十週年,首要任務便是找到「對的人」做行銷溝通
Thumbnail
文、圖/宏盟媒體集團提供   浩騰媒體延攬擁有媒體企劃服務17年資深經驗的陳東朋(Tomo Chen)加入團隊,擔任業務副總經理一職,帶領團隊提供客戶全方位品牌戰略,與客戶共創佳績。   加入浩騰媒體之前,陳東朋曾於傳立媒體擔任資深總監,擁有豐富的客戶服務、全方位數位媒體專業及消費者洞
Thumbnail
  2016港劇TVB【EU超時任務 Over Run Over】  凌晨風(朱千雪)-能穿越者,EU衝鋒隊警長 關鼎名 渠頭(王浩信)-能穿越者,渠頭,錦發圍村長 郭尚正 阿正(袁偉豪)-能穿越者,凌晨風之男友 陳勁威 威爺(單立文)-能穿越者,凌晨風EU小隊之車長 李姿婷 水晶梨(譚凱琪)-記者
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
按照慣例,帶有惡搞性質、以頒發最差電影頭銜為聞名的金酸莓獎都會選擇在奧斯卡金像獎前夕搶先公佈入圍名單,其中由動作巨星史泰龍領軍的系列電影《浴血任務4》不幸以最差電影、最差導演等七大獎項提名,成為今年(2024)第 44 屆金酸莓獎入圍階段的最大輸家。
Thumbnail
今天和大家分享一件由真實事件改編的故事,有次,美軍需要在初佔領的敵對國家興建軍用機場,興建機場需要發電系統,美軍需要想方法將發電機送至當地。然而,美軍大本營距離這佔領地區距離甚遠,中間只有少量美軍駐守,所以從陸路運輸發電機是沒有可能的。於是,美軍決定求助於各大運輸公司,由於飛行距離遠,加上途中全
Thumbnail
這次既然介紹了兩位我心目中《如果不是這個演員,便無法成就這部電影》的《丹尼爾雷德克里夫(Daniel Radcliffe)》以及《布蘭登·費雪 (Brendan James Fraser)》。 當然,我們絕對不能錯過那位被眾人視為神秘人物的《基努·查爾斯·李維 》
Thumbnail
格拉蒙侯爵(比爾史柯斯嘉)說:這世界上有三種人,為了目標而活的人,為了目標而死的人,為了殺戮而活的人;肯恩是三種都有,約翰維克是三種皆無。
Thumbnail
「沒有計畫,就沒有計畫失敗。」 沒有規劃時間也是。 剛開始要時間管理,一定會找一個行事曆app 一開始很熱情,把它排的滿滿的。 覺得自己就是一位時間管理大師。(我說我 然後發現中間沒空檔不行。 你會去上廁所,你會有突發狀況。 剛開始的我就是這麼安排的。 你會發現,開始跟不上,開始趕行程。 忙了一整天
Thumbnail
許久不見,過了好一些日子沒有上來寫寫東西,在這個短短的半個月中,我的生活起了一些變化,大家有過那種想盡辦法卻找不到一個方法的經驗嗎?
Thumbnail
2013 年,為 SUBARU 台灣意美汽車第一年開始舉辦「Brand Day」活動,不同於一般車商將活動辦在室內,SUBARU 的主打形象是「戶外特質」,因此將活動場地定為「戶外」。而 2017 年,SUBARU 進駐台灣第十週年,首要任務便是找到「對的人」做行銷溝通
Thumbnail
文、圖/宏盟媒體集團提供   浩騰媒體延攬擁有媒體企劃服務17年資深經驗的陳東朋(Tomo Chen)加入團隊,擔任業務副總經理一職,帶領團隊提供客戶全方位品牌戰略,與客戶共創佳績。   加入浩騰媒體之前,陳東朋曾於傳立媒體擔任資深總監,擁有豐富的客戶服務、全方位數位媒體專業及消費者洞
Thumbnail
  2016港劇TVB【EU超時任務 Over Run Over】  凌晨風(朱千雪)-能穿越者,EU衝鋒隊警長 關鼎名 渠頭(王浩信)-能穿越者,渠頭,錦發圍村長 郭尚正 阿正(袁偉豪)-能穿越者,凌晨風之男友 陳勁威 威爺(單立文)-能穿越者,凌晨風EU小隊之車長 李姿婷 水晶梨(譚凱琪)-記者