当前位置: 首页 > news >正文

JS中实现类似sleep、wait、delay的延时功能

前言

编写代码时很多时候需要进行流程化的操作,各个流程间通常需要等待一定时间,这在很多语言中通常可以使用 sleepwaitdelay 等函数来实现。JavaScript原生并没有类似的功能,想要延时通常就是使用 setTimeout(functionRef, delay) 方法。该方法使用比较简单,但是当一个流程中如果需要多次延时,就会出现回调地狱:

setTimeout(() => {console.log(`first print`);setTimeout(() => {console.log(`second print`);setTimeout(() => {console.log(`third print`);}, 1000);}, 1000);
}, 1000);

这种写法代码可读性和可维护性非常差,这种应用场景下使用很多支持多线程的语言中的延时函数就会方便很多。现在JS中加入了很多新的语法功能,可以方便的改造现有方法来实现类似其他语言中 sleepwaitdelay 的功能。

实现代码

具体的实现方法可能有非常多种,这里使用 Promiseasync/await 来实现相关功能,主要代码如下:

// 实现sleep功能,使用方式下面方式调用
// async function process(){
//     // your code ...
//     await sleep(1000);
//     // your code ...
// }
function sleep(ms) {return new Promise((resolve, reject) => {setTimeout(() => {resolve();}, ms);});
}

使用演示

在这里插入图片描述

上面演示中使用的完整代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>test</title><script>function getTimeStr(params) {let now = new Date();let year = now.getFullYear();let month = String(now.getMonth() + 1).padStart(2, '0');let day = String(now.getDate()).padStart(2, '0');let hours = String(now.getHours()).padStart(2, '0');let minutes = String(now.getMinutes()).padStart(2, '0');let seconds = String(now.getSeconds()).padStart(2, '0');let milliseconds = String(now.getMilliseconds()).padStart(3, '0');let formattedTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;return formattedTime;}</script><script>// 实现sleep功能,使用方式下面方式调用// async function process(){//     // your code ...//     await sleep(1000);//     // your code ...// }function sleep(ms) {return new Promise((resolve, reject) => {setTimeout(() => {resolve();}, ms);});}</script><script>(async () => {await sleep(1000);console.log(`${getTimeStr()} > first print`);await sleep(1000);console.log(`${getTimeStr()} > second print`);await sleep(1000);console.log(`${getTimeStr()} > third print`);})()</script>
</head><body></body></html>

相关文章:

  • 【今日三题】打怪(模拟) / 字符串分类(字符串哈希) / 城市群数量(dfs)
  • javaSE.判空包装类
  • Vue基础(6)_键盘事件
  • Kubernetes相关的名词解释CoreDNS插件(2)
  • C++——异常
  • RBAC的使用
  • 深入解析 JDK jstack 命令:线程分析的利器
  • CUDA编程中影响性能的小细节总结
  • Java PrintStream 类深度解析
  • 【AI提示词】经济学家
  • Pandas数据统计分析
  • 洛谷的几道题(2)
  • sed命令笔记250419
  • 金融数学专题6 证券问题与资本利得税
  • 5. 话题通信 ---- 发布方和订阅方python文件编写
  • EAGLE代码研读+模型复现
  • 缓慢前行,静待花开
  • three.js与webgl在buffer上的对应关系
  • 【Harmony】文本公共接口EditMenuOptions的使用
  • 第二十七讲:AI+农学导论
  • 画廊主韦尔:是喜是伤的一生
  • 人民文学奖颁出,董宇辉获传播贡献奖
  • 我国成功发射试验二十七号卫星01星~06星
  • 日本央行行长:美关税政策将冲击日本经济
  • 腾讯启动史上最大就业计划:三年新增2.8万个校招实习岗位,今年技术岗位占六成
  • 又一上海出品力作开播!孙俪再演职场丽人