js 延时执行代码的最佳实践 —— 自定义 sleep 函数

简介: js 延时执行代码的最佳实践 —— 自定义 sleep 函数

【最佳实践】核心代码 —— sleep 函数

function sleep(time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

使用演示 —— 需 async/await

单次延时

async function test() {
  print("开始执行代码");
  // 使用 async/await 语法,参数为需要延迟的时间,单位为毫秒
  await sleep(1000);
  print("通过 sleep 延迟1秒后执行");
  print("结束执行代码");
}

test();

执行结果

开始执行代码————当前时间:2024年5月23日9时50分15秒
通过 sleep 延迟1秒后执行————当前时间:2024年5月23日9时50分16秒
结束执行代码————当前时间:2024年5月23日9时50分16秒

串行延时

async function test() {
  print("开始执行代码");

  await sleep(1000);
  print("通过 sleep 延迟1秒后执行");

  await sleep(1000);
  print("通过 sleep 又延迟1秒后执行");

  await sleep(1000);
  print("通过 sleep 再延迟1秒后执行");

  print("结束执行代码");
}

test();

执行结果

开始执行代码————当前时间:2024年5月23日10时47分36秒
通过 sleep 延迟1秒后执行————当前时间:2024年5月23日10时47分37秒
通过 sleep 又延迟1秒后执行————当前时间:2024年5月23日10时47分38秒
通过 sleep 再延迟1秒后执行————当前时间:2024年5月23日10时47分39秒
结束执行代码————当前时间:2024年5月23日10时47分39秒

附赠 print 的代码

function print(info) {
  let dt = new Date();
  var y = dt.getFullYear();
  var mt = dt.getMonth() + 1;
  var day = dt.getDate();
  var h = dt.getHours(); //获取时
  var m = dt.getMinutes(); //获取分
  var s = dt.getSeconds(); //获取秒
  let str =
    "当前时间:" +
    y +
    "年" +
    mt +
    "月" +
    day +
    "日" +
    h +
    "时" +
    m +
    "分" +
    s +
    "秒";

  console.log(info + "————" + str);
}

setTimeout 和你想的不一样

js 延时执行代码的第一想法是使用 setTimeout,但它的效果可能和你想的不一样。

function test() {
  print("开始执行代码");

  setTimeout(() => {
    print("1秒的setTimeout");
  }, 1000);

  print("结束执行代码");
}

test();

执行结果

开始执行代码————当前时间:2024年5月23日9时55分1秒
结束执行代码————当前时间:2024年5月23日9时55分1秒
1秒的setTimeout————当前时间:2024年5月23日9时55分2秒

可见 setTimeout 是 js 的一种异步机制,它并不会阻塞同步代码的执行,具体的执行机制,详见 js【深度解析】代码的执行顺序

https://blog.csdn.net/weixin_41192489/article/details/136591137

setTimeout 仅适用于简单的、一次性延迟,若需要实现串行延时,还需要使用递增时长来实现(需自行计算累计时长,逻辑不够直观)

function test() {
  print("开始执行代码");

  setTimeout(() => {
    print("1秒的setTimeout");
  }, 1000);

  setTimeout(() => {
    print("2秒的setTimeout");
  }, 2000);

  setTimeout(() => {
    print("3秒的setTimeout");
  }, 3000);

  print("结束执行代码");
}

test();

【不推荐】while 循环阻塞实现延时

function sleep(delay) {
  var start = new Date().getTime();
  while (new Date().getTime() - start < delay) {
    continue;
  }
}
function test() {
  print("开始执行代码");
  sleep(1000);
  print("通过 sleep 延迟1秒后执行");
  print("结束执行代码");
}

test();

执行结果

开始执行代码————当前时间:2024年5月23日10时9分29秒
通过 sleep 延迟1秒后执行————当前时间:2024年5月23日10时9分30秒
结束执行代码————当前时间:2024年5月23日10时9分30秒

这是最传统的实现 sleep 的方法,确实实现了延时,但会阻塞整个线程,可能会冻结UI或导致程序崩溃,强烈不推荐!




目录
相关文章
|
17天前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
3月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
94 1
|
4月前
|
JavaScript 前端开发
怀孕b超单子在线制作,p图一键生成怀孕,JS代码装逼娱乐
模拟B超单的视觉效果,包含随机生成的胎儿图像、医疗文本信息和医院标志。请注意这仅用于前端开发学习
|
4月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
155 19
|
4月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
72 0
|
6月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
456 9
|
6月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
7月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
482 11
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~