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

閱讀時間約 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的鏈接:依序執行不斷產生的任務

4會員
6內容數
留言0
查看全部
發表第一個留言支持創作者!
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官方建議的正規方法,自己必須要看懂並且改寫算法
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
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
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
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小隊之車長 李姿婷 水晶梨(譚凱琪)-記者