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或导致程序崩溃,强烈不推荐!




目录
相关文章
|
15天前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
62 32
|
29天前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
116 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
27天前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
52 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
30天前
|
人工智能 JavaScript 前端开发
一段 JavaScript 代码,集成网站AI语音助手
根据本教程,只需通过白屏化的界面操作,即可快速构建一个专属的AI智能体。
|
2月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
141 15
在 golang 中执行 javascript 代码的方案详解
|
3月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
80 3
|
3月前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
56 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
3月前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
3月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
410 1

热门文章

最新文章

  • 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    23
  • 2
    Node.js 中实现多任务下载的并发控制策略
    32
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    【JavaScript】深入理解 let、var 和 const
    48
  • 5
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    44
  • 6
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    52
  • 7
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    55
  • 8
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    71
  • 9
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    55
  • 10
    JavaWeb JavaScript ③ JS的流程控制和函数
    62