首页 > 其他分享 >前端睡眠函数的用途与实现

前端睡眠函数的用途与实现

时间:2024-05-31 09:01:14浏览次数:25  
标签:睡眠 函数 异步 前端 sleep 操作 Promise setTimeout

主要用途:

  1. 测试异步代码:在编写测试用例时,特别是涉及异步操作的时候,sleep函数可以帮助我们创建出确定的时间间隔以测试代码的异步性能和行为。

  2. 模拟网络延迟:在开发过程中,我们可能需要模拟真实的网络环境,包括网络延迟。此时,sleep函数就能派上用场。

  3. 节流和防抖:在处理一些频繁触发的事件(如滚动、输入、点击等)时,使用sleep函数可以有效避免函数的过于频繁执行,从而达到节流和防抖的效果。

  4. 动画和过渡效果:在创建一些动画或过渡效果时,sleep函数常用于控制动画的播放速度或制造一些特定的延迟效果。

  5. 等待资源加载:在一些需要等待资源加载的场景(如等待文件读取、数据库查询返回或API响应等),sleep函数可以用于制造等待效果。

实现一个 sleep 函数最常见的方法是使用 JavaScript 的 Promise 对象和 setTimeout 函数。这是一个基本的 sleep 函数实现:

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

在这个函数中,我们创建了一个新的 Promise。Promise 构造函数接受一个函数,这个函数接受两个参数:一个是resolve,用于在异步操作成功时调用;一个是reject,用于在异步操作失败时调用。

我们传递给 Promise 构造函数的函数将 setTimeout 函数的回调设置为 resolve 方法,使得在指定的毫秒数之后,Promise 会变为 resolved 状态。当一个 Promise 变为 resolved 状态时,就可以使用 then 方法或者 async/await 来进行后续操作。
Promise 对象

Promise 是 JavaScript 中执行异步操作的一种方式。你可以将其视为一个异步操作的占位符,表示一个可能现在、未来或永远不会完成的异步操作的最终结果。

Promise 有三种状态:

  1. Pending(待定):初始状态,既不是成功,也不是失败。
  2. Fulfilled(已实现):表示操作成功完成。
  3. Rejected(已拒绝):表示操作失败。

当 Promise 从 Pending 状态变为 Fulfilled 或 Rejected 状态时,它就不会再改变状态,其结果(值或拒绝理由)也会永久保持不变。

Promise 对象通常与异步操作一起使用,例如网络请求、定时器、事件等。

setTimeout函数

setTimeout 是 JavaScript 中的窗口定时器函数,它可以在特定的时间间隔后运行一段代码,即在设定的一定时间后执行某些操作。

setTimeout 接受两个参数:第一个是要调用的函数,第二个是等待的时间(以毫秒为单位)。设置的时间是你希望过多久去执行这个函数,而不是确切的执行时间。因为 JavaScript 是单线程的,所以只有当当前执行栈上的所有任务都完成后,才会调用 setTimeout 中的函数。

举个例子:

setTimeout(function() {
  console.log('Hello after 2 seconds');
}, 2000);

在这个例子中,setTimeout 在2秒后打印出 ‘Hello after 2 seconds’。
这是如何使用 sleep 函数的例子:

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later');
}

demo();

在这个例子中,demo 函数在打印 “Taking a break…” 之后调用 sleep 函数暂停两秒钟,然后打印 “Two seconds later”。这就达到了 sleep 的效果。

需要注意的是,JS中的sleep函数并不会阻塞整个线程,它只是使得某个特定的异步操作暂时暂停执行,等待指定的时间后再继续执行。所以一般来说,除非有特殊需求,我们应该尽量避免在主线程中使用sleep函数,以免对程序的性能造成影响。

以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!

标签:睡眠,函数,异步,前端,sleep,操作,Promise,setTimeout
From: https://blog.csdn.net/weixin_43891869/article/details/139284067

相关文章

  • JS-08函数的4中调用方式详解
    目录1函数调用方式 2方法调用方式例1:声明一个对象,调用对象原型里的方法例2:直接调用对象里的方法例3:声明一个值为函数的变量clear,在一个对象tom里的某个属性c赋值为该变量clear,然后通过该对象tom调用这个变量c3构造函数调用方式例1:有一个函数,用new来赋值,则是赋值的......
  • 前端vue搭建
    1.找一个合适的模板,可以用vue-element-admin的模板,但是个人认为这个模板太大了,做小项目修改起来比较复杂,可以找一个比较小的项目2.我找的项目gitclonehttps://github.com/tuture-dev/vue-admin-template.git,这个下载需要先按照git添加图片注释,不超过140字(可选)360软件......
  • MySQL数据库中的分组函数ROLLUP
    ROLLUP是GROUPBY子句的扩展。ROLLUP选项允许包含表示小计的额外行,通常称为超级聚合行,以及总计行。通过使用ROLLUP选项,可以使用单个查询生成多个分组集。MySQL中的ROLLUP是用于 产生汇总输出的修饰符,包括表示超级汇总(较高级别)汇总操作的额外行。它使我们能够使用单个查询在......
  • Vue前端的搭建(与后端JavaEE的连接)
    目录前端平台搭建(Vue2.6,App:HBulderX)创建Vue2.6项目下载相应插件方便开发路由配置对连接后端进行一些配置(main.js文件)导入ElementUI组件组件|Element同步与异步axios异步请求框架前端平台搭建(Vue2.6,App:HBulderX)创建Vue2.6项目如图,创完之后的样子下载相应插件方......
  • Java函数式编程
    Java函数式编程Java8引入了对函数式编程的支持。Java8中引入的主要特性1.Lambda表达式和函数式接口:Lambda表达式允许以更简洁的方式表达一个方法的实现。函数式接口,只定义了一个抽象方法的接口(使用@FunctionalInterface注解来标记此类接口),与Lambda表达式一起使用,以便可......
  • 深入浅出CPU眼中的函数调用&栈溢出攻击
    深入浅出CPU眼中的函数调用——栈溢出攻击原理解读函数调用,大家再耳熟能详了,我们先看一个最简单的函数:#include<stdio.h>#include<stdlib.h>intfunc1(inta,intb){ intc=a+b;returnc;}intmain(){intres=func1();printf("%d",res);}函......
  • 使用Shader画常见的数学函数
    使用Shader画常见的数学函数本篇博文的灵感来自于ShaderBooks这一小节:https://thebookofshaders.com/05/?lan=ch代码运行网站:http://editor.thebookofshaders.com/一次函数\[y=x+0.5\]#ifdefGL_ESprecisionmediumpfloat;#endifuniformvec2u_resolution;unifor......
  • 前端面试题日常练-day42 【面试题】
    题目希望这些选择题能够帮助您进行前端面试的准备,答案在文末1.在Bootstrap中,以下哪个类用于创建一个具有响应式图片的容器?a).img-responsiveb).image-containerc).responsive-imgd).picture-container2.哪个Bootstrap类用于创建一个具有固定高度的容器?a).con......
  • 函数 (function)
    函数(function)题目描述Mr.Az学习了函数的知识,知道了函数只要输入一个值就会返回一个值。但他觉得这些函数太死板了,于是他想:如果存在一个函数能让我操控它的对应关系就好了,比如说让\(f(3)=2,f(15)=65,f(114514)=1919810\)等等。Mr.Az想控制函数其中的\(n\)对关系,每对关......
  • 测试λ 函数的一种方法:通过全局 λ 函数表,保存所有λ 函数
    下面的方式,把任意的局部代码包装在λ函数里,就地调用,同时把λ函数保存到全局表,在外部访问。#include<iostream>#include<vector>#include<functional>#include<map>#include<any>//全局的map,用于保存foo函数内部的lambda函数std::map<std::string,std::any>......