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




目录
相关文章
|
4天前
|
编解码 前端开发 JavaScript
javascript检测网页缩放演示代码
javascript检测网页缩放演示代码
|
6天前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
6天前
|
JavaScript 前端开发 安全
JavaScript函数详解
JavaScript函数的详细解析,包括函数的定义和调用方式(如一般格式、匿名函数、构造函数、自调用函数、箭头函数和严格模式)、函数参数(arguments对象、可变参数、默认参数值)、闭包的概念和应用实例。
JavaScript函数详解
|
6天前
|
JavaScript 前端开发
JavaScript函数可以返回两个值
JavaScript函数可以返回两个值
|
4天前
|
存储 JavaScript 前端开发
改进JavaScript代码,给水果有序赋色
改进JavaScript代码,给水果有序赋色
|
6天前
|
存储 JSON JavaScript
JavaScript帮我编写快递自动分拣的代码,区分省份市区县城乡镇
JavaScript帮我编写快递自动分拣的代码,区分省份市区县城乡镇在JavaScript中编写一个用于快递自动分拣的代码,区分省份、市区、县、城乡镇,通常意味着你需要一个数据结构来存储这些地理区域的信息,并编写逻辑来根据快递地址中的信息将其分配到正确的分类中。 这里,我将提供一个简化的示例,说明如何使用JavaScript对象和函数来实现这一功能。请注意,这个示例是高度简化的,并且假设你已经有了某种方式(如正则表达式或API调用)来从快递地址中提取省份、市区、县等信息。 ----------------------------------- ©著作权归作者所有:来自51CTO博客作者goS
|
6天前
|
自然语言处理 分布式计算 JavaScript
JavaScript函数
JavaScript函数
|
6天前
|
缓存 JavaScript 前端开发
了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
该文章详细讲解了JavaScript中的作用域、闭包概念及其应用场景,并简要分析了函数柯里化的使用。
了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
|
4天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
JSON JavaScript 前端开发
JavaScript的自定义对象
JavaScript的自定义对象