backup: js delay loop

news/2025/2/9 13:43:43/文章来源:https://www.cnblogs.com/shadow-abyss/p/18706074

 

在一次执行结束后等待指定间隔再执行下次

--see-also  https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setInterval

 1 const loop = (firstNoDelay, delay, callbackFn) => {
 2   // firstNoDelay : true 立即执行第一次
 3   // delay 单位毫秒
 4   const wrappedCallback = () => {
 5     try {
 6       callbackFn();
 7       return [];
 8     } catch (err) {
 9       return [ err ];
10     }
11   };
12 
13   let running = true;
14   let timer = null;
15   const loopInner = () => {
16     timer = setTimeout(() => {
17       if (running) {
18         wrappedCallback();
19         loopInner();
20       }
21     }, delay);
22   }
23 
24   const firstPromise = firstNoDelay ? new Promise((resolve, reject) => {
25     return resolve(wrappedCallback());
26   }) : Promise.resolve([]);
27 
28   firstPromise.then((r) => {
29     // console.log('[DEBUG] loop result of first', r);
30     loopInner();
31     return 0;
32   });
33 
34   return () => {
35     running = false;
36     const t = timer;
37     if (t == null) {
38       console.log("no timer");
39     } else {
40       timer = null;
41       console.log("clear timer", t);
42       clearTimeout(t);
43     }
44   };
45 };

 

html 示例

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>test recurse timeout</title>
 5 </head>
 6 <body>
 7     <button id="startBtn">start</button>
 8     <button id="stopBtn">stop</button>
 9     <div id="testDiv"></div>
10 
11     <script>
12         const loop = (firstNoDelay, delay, callbackFn) => {
13           // firstNoDelay : true 立即执行第一次
14           // delay 单位毫秒
15           const wrappedCallback = () => {
16             try {
17               callbackFn();
18               return [];
19             } catch (err) {
20               return [ err ];
21             }
22           };
23 
24           let running = true;
25           let timer = null;
26           const loopInner = () => {
27             timer = setTimeout(() => {
28               if (running) {
29                 wrappedCallback();
30                 loopInner();
31               }
32             }, delay);
33           }
34 
35           const firstPromise = firstNoDelay ? new Promise((resolve, reject) => {
36             return resolve(wrappedCallback());
37           }) : Promise.resolve([]);
38 
39           firstPromise.then((r) => {
40             // console.log('[DEBUG] loop result of first', r);
41             loopInner();
42             return 0;
43           });
44 
45           return () => {
46             running = false;
47             const t = timer;
48             if (t == null) {
49               console.log("no timer");
50             } else {
51               timer = null;
52               console.log("clear timer", t);
53               clearTimeout(t);
54             }
55           };
56         };
57         document.addEventListener("DOMContentLoaded", () => {
58             console.log("loaded");
59             const testDiv = document.getElementById("testDiv");
60             const startBtn = document.getElementById("startBtn");
61             const stopBtn = document.getElementById("stopBtn");
62 
63             const loopTerms = [];
64             startBtn.addEventListener("click", () => {
65                 startBtn.disabled = true;
66                 const startTimeTxt = `${new Date()}`
67                 const clearLoop = loop(true, 1000, () => {testDiv.innerText = `${startTimeTxt} \n ${new Date()}`});
68                 loopTerms.push(clearLoop);
69             });
70             stopBtn.addEventListener("click", () => {
71                 startBtn.disabled = false;
72                 for (let clrLoop = loopTerms.shift(); clrLoop; clrLoop = loopTerms.shift()) {
73                     clrLoop();
74                 }
75             });
76         });
77     </script>
78 </body>
79 </html>

 

--- THE END ---

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881213.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红蓝对抗之系统密码提取

mimikatz mimikatz工具从内存中提取明文密码,HASH值,PIN密码和票据,利用zerologon漏洞(通过NetLogon/MS-NRPC协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码设置为空。 mimikatz 需要管理员或 SYSTEM 权限,通常使用 DEBUG 权限执行某些操作,与 LSASS…

wsl启动报错Cannot execute daemonize to start systemd的解决方法

WSL 启动报错 "Cannot execute daemonize to start systemd" 的解决方法 问题背景 在启动 WSL2 时遇到以下错误: Cannot execute daemonize to start systemd解决思路来源:https://github.com/DamionGans/ubuntu-wsl2-systemd-script/issues/37此错误通常是因为 dae…

2.2-2.9做题笔记

2.2 - 2.9 做题笔记 最近一周做的所有题目,包括 cyezoj 上的模拟赛,专题作业和 ABC。 2.4 CYEZ SHOI2025 模拟测试七 CYEZ 404 过桥 题目难度:省选 D1T1 赛时:20pts ;订正:100pts 大意 有 \(n\) 个人要过一座每次最多容 \(c\) 人通过、且仅有一只手电的一座桥。多人同时过…

【烂笔头系列】计算广告笔记16-其他广告相关技术

创意优化 创意需要将向用户推送广告的关键原因明确表达出来 程序化创意地域性创意 搜索重定向创意 个性化重定向创意电机热力图电机热力图是将某一个创意各位置被点击的密度用热力图方式呈现,帮助创意优化者直观的发现和解决其中的问题创意的发展趋势视频化激励视频形式交互化…

【烂笔头系列】推荐系统笔记10-经典深度学习推荐模型

特征组合和特征交叉问题非常常见,特征的种类非常多,特征交叉的复杂程度也要大得多。解决这类问题的关键,就是模型对于特征组合和特征交叉的学习能力,因为它决定了模型对于未知特征组合样本的预测能力,而这对于复杂的推荐问题来说,是决定其推荐效果的关键点之一。 那特征交…

【烂笔头系列】推荐系统笔记09-深度学习推荐模型发展脉络

1. 深度学习模型拟合能力更强 特征交叉方式中,点积等方式过于简单,在样本数据比较复杂的情况下,容易欠拟合。而深度学习可以大大提高模型的拟合能力,比如在 NeuralCF(神经网络协同过滤)模型中,点积层被替换为多层神经网络,理论上多层神经网络具备拟合任意函数的能力,所…

【烂笔头系列】推荐系统笔记12-模型评估

1. 离线评估 (1)介绍 离线评估是最常用、最基本的。顾名思义就是:我们将模型部署于线上环境之前,在离线环境下进行的评估。由于不用部署到生产环境,“离线评估”没有线上部署的工程风险,也不会浪费宝贵的线上流量资源,而且具有测试时间短,可多组并行,以及能够利用丰富…

【烂笔头系列】推荐系统笔记05-Embedding技术

1. Embedding是什么 Embedding 就是用一个数值向量“表示”一个对象(Object)的方法解读1:左边例子,从 king 到 queen 的向量和从 man 到 woman 的向量,无论从方向还是尺度来说它们都非常接近。 解读2:右边例子也很典型,从 walking 到 walked 和从 swimming 到 swam 的向…

【烂笔头系列】推荐系统笔记04-推荐系统有哪些可以利用的特征

1. 特征与工程 (1)特征就是对具体行为的抽象,但是抽象过程会造成信息的损失 ① 因为具体的推荐行为和场景中包含大量原始的场景、图片和状态信息,保存所有信息的存储空间过大,我们根本无法实现。 ② 因为具体的推荐场景中包含大量冗余的、无用的信息,把它们都考虑进来甚至…

1.AI 大模型的基本概念

1.目前AI 行业分类 2023年, AI 分 传统AI(机器学习、深度学习、强化学习) AI算法工程师 AI大模型(AI2.0)神经网络,自注意机制,Transform机制 AI应用开发工程师 2.什么是AI 大模型(LLM) 参数大,训练的数据集大 3.AI大模型最终价值 TOB 和 TOC 的应用 4.A…

【烂笔头系列】小红书推荐系统学习笔记06-冷启动

物品冷启动评价指标 物品冷启动目标精准推荐:新物品的推荐效果往往比较差 激励发布:新物品得到较多流量后,更容易激励作者。 挖掘高潜:从新物品中挖掘高质量物品。评价指标作者指标:发布渗透量、人均发布量等 用户指标:新笔记的交互率、大盘指标(比如日活、月活、时长)…

【烂笔头系列】小红书推荐系统学习笔记05-重排

重排是精排的后处理操作。 物品多样性 相似度度量基于物品属性标签基于物品向量表征 (1)双塔模型的物品塔,但是因为头部效应问题导致学不好物品向量表征 (2)基于图文内容学习CLIP - 基于图文内容的物品向量表征 原理 对于图片-文本二元组数据进行对比学习,预测图文是否匹…