【面试题】写一个睡眠函数
题目要求
请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。
示例 1:
输入:millis = 100
输出:100
解释:
在 100ms 后此异步函数执行完时返回一个 Promise 对象
let t = Date.now();
sleep(100).then(() => {
console.log(Date.now() - t); // 100
});
示例 2:
输入:millis = 200
输出:200
解释:在 200ms 后函数执行完时返回一个 Promise 对象
方法 1:使用 Promises 和 setTimeout 的异步编程
概述
在 JavaScript 中,通常使用承诺来处理异步操作。承诺表示一个值,该值可能还不可用,但将在将来的某个时候解决(或在出错的情况下拒绝)。要在 JavaScript 中模拟延迟或“休眠”,我们可以使用 setTimeout 函数,该函数将一个函数调度为在一段时间后运行。
该任务要求我们创建一个休眠指定毫秒的异步函数。要实现这一点,我们可以将 promises 与 setTimeout 结合起来。我们将返回在指定延迟后解决的承诺。
算法步骤
- 定义一个名为 sleep(millis) 的异步函数。此函数在解析之前将暂停执行 millis 毫秒。
- 在该函数内部,构造一个新的 promise 对象。这个 promise 对象的 executor 函数是我们将合并延迟的地方。
- 在 executor 函数中,使用 setTimeout 方法。setTimeout 是由主机环境(Web 浏览器、Node.js等)提供的方法。它在指定的延迟后执行提供的函数或代码段。
- 将 setTimeout 的延迟设置为 millis 毫秒。延迟后执行的代码将是 promise 的 resolve 方法。
- 当调用 resolve 方法时,它会将承诺标记为已实现,从而允许执行任何附加的 .then 处理程序。
实现
async function sleep(millis) {return new Promise(resolve => {setTimeout(resolve, millis);});
}
在此实现中,sleep 函数是返回 promise 的异步函数。promise 的 executor 函数使用 setTimeout 在 millis 毫秒后解析 promise。请注意,我们实际上并不需要将睡眠功能设置为异步,因为我们直接返回一个 promise,但将其标记为 async 并不会有什么坏处。
你可以像这样在你的代码中使用 sleep 函数:
let t = Date.now();
sleep(100).then(() => {console.log(Date.now() - t); // 大约 100
});
在这种用法中,我们记录当前时间,调用 sleep 函数,然后记录 promise 解析时经过的时间。运行时间应该大致等于 sleep 的输入,这表明函数确实已经“休眠”了指定的时间量。
请注意,使用 return new Promise() 或 return await new Promise() 都会在异步函数中产生相同的结果,如概述部分所述。
此外,使用 try {} catch(){} 也是异步编程中的一种常见做法,因为它允许您处理可能引发的任何潜在异常。在下面的解决方案中,如果在 setTimeout 函数的执行过程中出现错误,则 promise 被拒绝,并抛出错误:
async function sleep(millis) {return new Promise((res,rej) => {try {setTimeout(() => res(5), millis)} catch(err) {rej(err)}})
}
方法 2:使用 Promises 和 setTimeout 不带返回的异步编程
这种方法与第一种方法类似,但略有不同:对于这个问题,您不需要显式返回任何内容。这也使以下代码成为有效的解决方案。此版本的 sleep 函数不返回任何内容(或者更准确地说,它返回 undefined),因为没有返回语句。但由于问题陈述说,“它可以求解任何值”,这是完全可以接受的。这也是一个非常有效的俏皮话。
实现
async function sleep(milliseconds) {await new Promise(res => setTimeout(res, milliseconds));
}
相关文章:
【面试题】写一个睡眠函数
题目要求 请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1: 输入:millis 100 输出:100 解释: 在 100ms 后此异步函数执行完时返回一个 Pro…...
4. 云原生之kubesphere基础服务搭建
文章目录 安装kubesphere插件服务暴露NodePort方式LoadBalancer方式安装 OpenELB部署eip资源配置网关启动网关创建路由测试网关路由ingress高级功能在服务中配置LoadBalancer 基础设施部署服务部署建议helm仓库添加helm仓库 运维相关部署gitlab部署nexus3部署harbor 研发相关 安…...
思福迪运维安全管理系统 任意文件读取漏洞
产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机 漏洞概述 由于思福迪运维安全管理系统 GetCaCert路由存在任意文件读取漏洞,攻击者可通过该漏洞在服务器端读取任意文件敏感内容,可能导致攻击者后续获取到相关的服务器权限 资…...
OCR在审核应用落地
本文字数:6686字 预计阅读时间:35分钟 01 背景 1、业务背景 在传统视频审核场景中,审核人员需要对进审视频中的文字内容进行逐一审核,避免在文字上出现敏感词、违禁词或者广告等相关词汇。这种人工审核费时费力,并且由…...
借贷协议 Tonka Finance:铭文资产流动性的新破局者
“Tonka Finance 是铭文赛道中首个借贷协议,它正在为铭文资产赋予捕获流动性的能力,并为其构建全新的金融场景。” 在 2023 年的 1 月,比特币 Ordinals 协议被推出后,包括 BRC20,Ordinals 等在内的系列铭文资产在包括比…...
Python+Yolov5+Qt交通标志特征识别窗体界面相片视频摄像头
程序示例精选 PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头》编写代码&a…...
浅谈高并发以及三大利器:缓存、限流和降级
引言 高并发背景 互联网行业迅速发展,用户量剧增,系统面临巨大的并发请求压力。 软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道很多,全面讨论需要三天三夜&#…...
深入ArkUI:深入实战组件text和text input
文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…...
WPF 基础(Binding 二)
续接上文,本章继续讲解WPF Binding相关知识,主要内容是绑定的模式和绑定源(Source) 5绑定模式 在使用Binding类的时候有4中绑定模式可以选择 BindingMode TwoWay导致对源属性或目标属性的更改可自动更新对方。此绑定类型适用于…...
限制el-upload组件的上传文件大小
限制el-upload组件的上传文件大小 <el-upload :before-upload"handleBeforeUpload"><!-- 其他组件内容 --> </el-upload>Vue实例中定义handleBeforeUpload方法来进行文件大小的验证。你可以使用file.size属性来获取文件的大小,并与你期…...
什么是爬虫,为什么爬虫会导致服务器负载跑满
在我们日常使用服务器的过程中,经常会有遇到各种各样的问题。今天就有遇到用户来跟德迅云安全反馈自己服务器负载跑满,给用户详细排查后也未发现异常,抓包查看也没有明显攻击特征,后续查看发现是被爬虫爬了,调整处理好…...
线上隐私保护的未来:分布式身份DID的潜力
在日益数字化的世界中,人们的生活越来越多地依赖于互联网,数字身份也因而变得越来越重要。根据法律规定,互联网应用需要确认用户的真实身份才能提供各种服务,而用户则希望在进行身份认证的同时能够尽量保护他们的个人隐私…...
服务器被入侵后如何查询连接IP以及防护措施
目前越来越多的服务器被入侵,以及攻击事件频频的发生,像数据被窃取,数据库被篡改,网站被强制跳转到恶意网站上,网站在百度的快照被劫持等等的攻击症状层出不穷,在这些问题中,如何有效、准确地追…...
【开源】基于Vue+SpringBoot的公司货物订单管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…...
2023-12-29 服务器开发-Centos部署LNMP环境
摘要: 2023-12-29 服务器开发-Centos部署LNMP环境 centos7.2搭建LNMP具体步骤 1.配置防火墙 CentOS 7.0以上的系统默认使用的是firewall作为防火墙, 关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable fire…...
CEC2017(Python):五种算法(DE、RFO、OOA、PSO、GWO)求解CEC2017
一、5种算法简介 1、差分进化算法DE 2、红狐优化算法RFO 3、鱼鹰优化算法OOA 4、粒子群优化算法PSO 5、灰狼优化算法GWO 二、CEC2017简介 参考文献: [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem defini…...
数字身份验证:跨境电商如何应对账户安全挑战?
在数字化时代,随着跨境电商的蓬勃发展,账户安全问题逐渐成为行业和消费者关注的焦点。随着网络犯罪日益猖獗,用户的数字身份安全面临着更加复杂的威胁。本文将深入探讨数字身份验证在跨境电商中的重要性,并探讨各种创新技术和策略…...
Nature | 大型语言模型(LLM)能够发现和产生新知识吗?
大型语言模型(LLM)是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络,这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义,并理解其中的单词和短语之间的关系。通…...
C# 使用ZXing.Net生成二维码和条码
写在前面 条码生成是一个经常需要处理的功能,本文介绍一个条码处理类库,ZXing用Java实现的多种格式的一维二维条码图像处理库,而ZXing.Net是其.Net版本的实现。 在WinForm下使用该类库需要从NuGet安装两个组件: ZXing.Net ZXing…...
Windows系统配置pytorch环境,Jupyter notebook编辑器安装使用(深度学习本地篇)
如今现在好一点的笔记本都自带英伟达独立显卡,对于一些简单的深度学习项目,是不需要连接服务器的,甚至数据量不大的话,cpu也足够进行训练学习。我把电脑上一些以前的笔记整理一下,记录起来,方便自己35岁事业…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
